feat(car): 更新 Toyota Wildlander PHEV 车型配置及依赖项
将原有 TOYOTA_WILDLANDER 车型标识重命名为 TOYOTA_WILDLANDER_PHEV, 并更新相关指纹、平台名称和测试路由配置。同时增加该车型的 SRS 和 Hybrid ECU 固件版本信息。 此外,修改 dmonitoringd.py 中的监控逻辑,使在 always_on 模式下也能执行 DM.run_step 流程。 还更新了 launch_openpilot.sh 中的 API 和 ATHENA 服务地址。
This commit is contained in:
parent
1f7233cb98
commit
b40c885c6a
@ -17,4 +17,7 @@ if [ "$MODEL" = "comma tici" ]; then
|
|||||||
exec "$C3_LAUNCH_SH"
|
exec "$C3_LAUNCH_SH"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
export API_HOST=https://api.konik.ai
|
||||||
|
export ATHENA_HOST=wss://athena.konik.ai
|
||||||
|
|
||||||
exec ./launch_chffrplus.sh
|
exec ./launch_chffrplus.sh
|
||||||
|
|||||||
@ -38,7 +38,7 @@ non_tested_cars = [
|
|||||||
HYUNDAI.KIA_SELTOS_2023_NON_SCC,
|
HYUNDAI.KIA_SELTOS_2023_NON_SCC,
|
||||||
HYUNDAI.GENESIS_G70_2021_NON_SCC,
|
HYUNDAI.GENESIS_G70_2021_NON_SCC,
|
||||||
HONDA.HONDA_CLARITY,
|
HONDA.HONDA_CLARITY,
|
||||||
TOYOTA.TOYOTA_WILDLANDER,
|
TOYOTA.TOYOTA_WILDLANDER_PHEV,
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -97,4 +97,4 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
|
|||||||
"GENESIS_G70_2021_NON_SCC" = "HYUNDAI_SONATA"
|
"GENESIS_G70_2021_NON_SCC" = "HYUNDAI_SONATA"
|
||||||
"HYUNDAI_BAYON_1ST_GEN_NON_SCC" = "HYUNDAI_SONATA"
|
"HYUNDAI_BAYON_1ST_GEN_NON_SCC" = "HYUNDAI_SONATA"
|
||||||
"HONDA_CLARITY" = "HONDA_CIVIC"
|
"HONDA_CLARITY" = "HONDA_CIVIC"
|
||||||
"TOYOTA_WILDLANDER" = "TOYOTA_RAV4_TSS2"
|
"TOYOTA_WILDLANDER_PHEV" = "TOYOTA_RAV4_TSS2"
|
||||||
|
|||||||
@ -157,7 +157,7 @@ class CarInterface(CarInterfaceBase):
|
|||||||
if candidate in UNSUPPORTED_DSU_CAR:
|
if candidate in UNSUPPORTED_DSU_CAR:
|
||||||
ret.safetyParam |= ToyotaSafetyFlagsSP.UNSUPPORTED_DSU
|
ret.safetyParam |= ToyotaSafetyFlagsSP.UNSUPPORTED_DSU
|
||||||
|
|
||||||
if candidate in (CAR.TOYOTA_WILDLANDER, ):
|
if candidate in (CAR.TOYOTA_WILDLANDER_PHEV, ):
|
||||||
stock_cp.lateralTuning.init('pid')
|
stock_cp.lateralTuning.init('pid')
|
||||||
stock_cp.lateralTuning.pid.kiBP = [0.0]
|
stock_cp.lateralTuning.pid.kiBP = [0.0]
|
||||||
stock_cp.lateralTuning.pid.kpBP = [0.0]
|
stock_cp.lateralTuning.pid.kpBP = [0.0]
|
||||||
|
|||||||
@ -397,7 +397,7 @@ class CAR(Platforms):
|
|||||||
)
|
)
|
||||||
|
|
||||||
# port extensions
|
# port extensions
|
||||||
TOYOTA_WILDLANDER = ToyotaSecOCPlatformConfig(
|
TOYOTA_WILDLANDER_PHEV = ToyotaSecOCPlatformConfig(
|
||||||
[ToyotaCarDocs("Toyota Wildlander PHEV 2021", min_enable_speed=MIN_ACC_SPEED)],
|
[ToyotaCarDocs("Toyota Wildlander PHEV 2021", min_enable_speed=MIN_ACC_SPEED)],
|
||||||
CarSpecs(mass=4155. * CV.LB_TO_KG, wheelbase=2.69, steerRatio=16.88, tireStiffnessFactor=0.5533),
|
CarSpecs(mass=4155. * CV.LB_TO_KG, wheelbase=2.69, steerRatio=16.88, tireStiffnessFactor=0.5533),
|
||||||
)
|
)
|
||||||
|
|||||||
@ -3586,7 +3586,7 @@
|
|||||||
"package": "All"
|
"package": "All"
|
||||||
},
|
},
|
||||||
"Toyota Wildlander PHEV 2021": {
|
"Toyota Wildlander PHEV 2021": {
|
||||||
"platform": "TOYOTA_WILDLANDER",
|
"platform": "TOYOTA_WILDLANDER_PHEV",
|
||||||
"make": "Toyota",
|
"make": "Toyota",
|
||||||
"brand": "toyota",
|
"brand": "toyota",
|
||||||
"model": "Wildlander PHEV",
|
"model": "Wildlander PHEV",
|
||||||
|
|||||||
@ -4,7 +4,7 @@ from opendbc.car.toyota.values import CAR
|
|||||||
Ecu = CarParams.Ecu
|
Ecu = CarParams.Ecu
|
||||||
|
|
||||||
FW_VERSIONS_EXT = {
|
FW_VERSIONS_EXT = {
|
||||||
CAR.TOYOTA_WILDLANDER: {
|
CAR.TOYOTA_WILDLANDER_PHEV: {
|
||||||
(Ecu.engine, 0x700, None): [
|
(Ecu.engine, 0x700, None): [
|
||||||
b'\x01896630R57001\x00\x00\x00\x00',
|
b'\x01896630R57001\x00\x00\x00\x00',
|
||||||
],
|
],
|
||||||
@ -20,5 +20,11 @@ FW_VERSIONS_EXT = {
|
|||||||
(Ecu.fwdRadar, 0x750, 0xf): [
|
(Ecu.fwdRadar, 0x750, 0xf): [
|
||||||
b'\x018821F3301400\x00\x00\x00\x00',
|
b'\x018821F3301400\x00\x00\x00\x00',
|
||||||
],
|
],
|
||||||
|
(Ecu.srs, 0x780, None): [
|
||||||
|
b'\x018917F0R18000\x00\x00\x00\x00'
|
||||||
|
],
|
||||||
|
(Ecu.hybrid, 0x7d2, None): [
|
||||||
|
b'\x02899830R24000\x00\x00\x00\x00899850R05000\x00\x00\x00\x00'
|
||||||
|
],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,7 @@ def dmonitoringd_thread():
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
valid = sm.all_checks()
|
valid = sm.all_checks()
|
||||||
if valid:
|
if DM.always_on and valid:
|
||||||
DM.run_step(sm)
|
DM.run_step(sm)
|
||||||
|
|
||||||
# publish
|
# publish
|
||||||
|
|||||||
@ -72,25 +72,25 @@ def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubM
|
|||||||
if "REPLAY" in os.environ:
|
if "REPLAY" in os.environ:
|
||||||
branch = "replay"
|
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:
|
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:
|
def below_steer_speed_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
|
||||||
return Alert(
|
return Alert(
|
||||||
f"Steer Unavailable Below {get_display_speed(CP.minSteerSpeed, metric)}",
|
f"转向在 {get_display_speed(CP.minSteerSpeed, metric)} 以下不可用",
|
||||||
"",
|
"",
|
||||||
AlertStatus.userPrompt, AlertSize.small,
|
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:
|
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(
|
return Alert(
|
||||||
f"{first_word} in Progress: {sm['liveCalibration'].calPerc:.0f}%",
|
f"{first_word}进行中:{sm['liveCalibration'].calPerc:.0f}%",
|
||||||
f"Drive Above {get_display_speed(MIN_SPEED_FILTER, metric)}",
|
f"请将时速提高至 {get_display_speed(MIN_SPEED_FILTER, metric)} 进行校准",
|
||||||
AlertStatus.normal, AlertSize.mid,
|
AlertStatus.normal, AlertSize.mid,
|
||||||
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2)
|
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:
|
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)
|
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:
|
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
|
mdl = sm['modelV2'].velocity.x[0] if len(sm['modelV2'].velocity.x) else math.nan
|
||||||
err = CS.vEgo - mdl
|
err = CS.vEgo - mdl
|
||||||
msg = f"Speed Error: {err:.1f} m/s"
|
msg = f"速度误差: {err:.1f} 米/秒"
|
||||||
return NoEntryAlert(msg, alert_text_1="Posenet Speed Invalid")
|
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:
|
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]
|
not_running = [p.name for p in sm['managerState'].processes if not p.running and p.shouldBeRunning]
|
||||||
msg = ', '.join(not_running)
|
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:
|
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, ])]
|
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
|
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:
|
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')
|
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, ])]
|
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:
|
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
|
rpy = sm['liveCalibration'].rpyCalib
|
||||||
yaw = math.degrees(rpy[2] if len(rpy) == 3 else math.nan)
|
yaw = math.degrees(rpy[2] if len(rpy) == 3 else math.nan)
|
||||||
pitch = math.degrees(rpy[1] 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}°)"
|
angles = f"请重新安装设备 (俯仰角: {pitch:.1f}°, 偏航角: {yaw:.1f}°)"
|
||||||
return NormalPermanentAlert("Calibration Invalid", angles)
|
return NormalPermanentAlert("校准无效", angles)
|
||||||
|
|
||||||
|
|
||||||
def paramsd_invalid_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
|
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:
|
if not sm['liveParameters'].angleOffsetValid:
|
||||||
angle_offset_deg = sm['liveParameters'].angleOffsetDeg
|
angle_offset_deg = sm['liveParameters'].angleOffsetDeg
|
||||||
title = "Steering misalignment detected"
|
title = "转向系统未对准"
|
||||||
text = f"Angle offset too high (Offset: {angle_offset_deg:.1f}°)"
|
text = f"角度偏移过大 (偏移量: {angle_offset_deg:.1f}°)"
|
||||||
elif not sm['liveParameters'].steerRatioValid:
|
elif not sm['liveParameters'].steerRatioValid:
|
||||||
steer_ratio = sm['liveParameters'].steerRatio
|
steer_ratio = sm['liveParameters'].steerRatio
|
||||||
title = "Steer ratio mismatch"
|
title = "转向传动比不匹配"
|
||||||
text = f"Steering rack geometry may be off (Ratio: {steer_ratio:.1f})"
|
text = f"转向齿条几何可能不正确 (传动比: {steer_ratio:.1f})"
|
||||||
elif not sm['liveParameters'].stiffnessFactorValid:
|
elif not sm['liveParameters'].stiffnessFactorValid:
|
||||||
stiffness_factor = sm['liveParameters'].stiffnessFactor
|
stiffness_factor = sm['liveParameters'].stiffnessFactor
|
||||||
title = "Abnormal tire stiffness"
|
title = "轮胎刚度异常"
|
||||||
text = f"Check tires, pressure, or alignment (Factor: {stiffness_factor:.1f})"
|
text = f"请检查轮胎、胎压或定位 (系数: {stiffness_factor:.1f})"
|
||||||
else:
|
else:
|
||||||
return NoEntryAlert("paramsd Temporary Error")
|
return NoEntryAlert("paramsd 临时错误")
|
||||||
|
|
||||||
return NoEntryAlert(alert_text_1=title, alert_text_2=text)
|
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.)
|
cpu = max(sm['deviceState'].cpuTempC, default=0.)
|
||||||
gpu = max(sm['deviceState'].gpuTempC, default=0.)
|
gpu = max(sm['deviceState'].gpuTempC, default=0.)
|
||||||
temp = max((cpu, gpu, sm['deviceState'].memoryTempC))
|
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:
|
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:
|
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.)
|
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:
|
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:
|
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.
|
gb = sm['carControl'].actuators.accel / 4.
|
||||||
steer = sm['carControl'].actuators.torque
|
steer = sm['carControl'].actuators.torque
|
||||||
vals = f"Gas: {round(gb * 100.)}%, Steer: {round(steer * 100.)}%"
|
vals = f"油门: {round(gb * 100.)}%, 转向: {round(steer * 100.)}%"
|
||||||
return NormalPermanentAlert("Joystick Mode", vals)
|
return NormalPermanentAlert("操纵杆模式", vals)
|
||||||
|
|
||||||
|
|
||||||
def longitudinal_maneuver_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
|
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:
|
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()
|
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:
|
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":
|
if CP.brand == "tesla":
|
||||||
text = "Switch to Traffic-Aware Cruise Control to engage"
|
text = "请切换到交通感知巡航控制以启用"
|
||||||
elif CP.brand == "mazda":
|
elif CP.brand == "mazda":
|
||||||
text = "Enable your car's LKAS to engage"
|
text = "请启用您的车辆LKAS以启用"
|
||||||
elif CP.brand == "nissan":
|
elif CP.brand == "nissan":
|
||||||
text = "Disable your car's stock LKAS to engage"
|
text = "请禁用您的车辆原厂LKAS以启用"
|
||||||
return NormalPermanentAlert("Invalid LKAS setting", text)
|
return NormalPermanentAlert("无效的LKAS设置", text)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -225,21 +232,21 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.joystickDebug: {
|
EventName.joystickDebug: {
|
||||||
ET.WARNING: joystick_alert,
|
ET.WARNING: joystick_alert,
|
||||||
ET.PERMANENT: NormalPermanentAlert("Joystick Mode"),
|
ET.PERMANENT: NormalPermanentAlert("操纵杆模式"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.longitudinalManeuver: {
|
EventName.longitudinalManeuver: {
|
||||||
ET.WARNING: longitudinal_maneuver_alert,
|
ET.WARNING: longitudinal_maneuver_alert,
|
||||||
ET.PERMANENT: NormalPermanentAlert("Longitudinal Maneuver Mode",
|
ET.PERMANENT: NormalPermanentAlert("纵向操作模式",
|
||||||
"Ensure road ahead is clear"),
|
"确保前方道路畅通"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.selfdriveInitializing: {
|
EventName.selfdriveInitializing: {
|
||||||
ET.NO_ENTRY: NoEntryAlert("System Initializing"),
|
ET.NO_ENTRY: NoEntryAlert("系统初始化中"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.startup: {
|
EventName.startup: {
|
||||||
ET.PERMANENT: StartupAlert("Be ready to take over at any time")
|
ET.PERMANENT: StartupAlert("请随时准备接管您的车辆控制权")
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.startupMaster: {
|
EventName.startupMaster: {
|
||||||
@ -247,28 +254,28 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
EventName.startupNoControl: {
|
EventName.startupNoControl: {
|
||||||
ET.PERMANENT: StartupAlert("Dashcam mode"),
|
ET.PERMANENT: StartupAlert("仅行车记录仪模式"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Dashcam mode"),
|
ET.NO_ENTRY: NoEntryAlert("仅行车记录仪模式"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.startupNoCar: {
|
EventName.startupNoCar: {
|
||||||
ET.PERMANENT: StartupAlert("Dashcam mode for unsupported car"),
|
ET.PERMANENT: StartupAlert("不支持车辆的行车记录仪模式"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.startupNoSecOcKey: {
|
EventName.startupNoSecOcKey: {
|
||||||
ET.PERMANENT: NormalPermanentAlert("Dashcam Mode",
|
ET.PERMANENT: NormalPermanentAlert("仅行车记录仪模式",
|
||||||
"Security Key Not Available",
|
"安全密钥不可用",
|
||||||
priority=Priority.HIGH),
|
priority=Priority.HIGH),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.dashcamMode: {
|
EventName.dashcamMode: {
|
||||||
ET.PERMANENT: NormalPermanentAlert("Dashcam Mode",
|
ET.PERMANENT: NormalPermanentAlert("行车记录仪模式",
|
||||||
priority=Priority.LOWEST),
|
priority=Priority.LOWEST),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.invalidLkasSetting: {
|
EventName.invalidLkasSetting: {
|
||||||
ET.PERMANENT: invalid_lkas_setting_alert,
|
ET.PERMANENT: invalid_lkas_setting_alert,
|
||||||
ET.NO_ENTRY: NoEntryAlert("Invalid LKAS setting"),
|
ET.NO_ENTRY: NoEntryAlert("车道保持辅助系统(LKAS)设置无效"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.cruiseMismatch: {
|
EventName.cruiseMismatch: {
|
||||||
@ -279,40 +286,40 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
# read-only mode. This can be solved by adding your fingerprint.
|
# read-only mode. This can be solved by adding your fingerprint.
|
||||||
# See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information
|
# See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information
|
||||||
EventName.carUnrecognized: {
|
EventName.carUnrecognized: {
|
||||||
ET.PERMANENT: NormalPermanentAlert("Dashcam Mode",
|
ET.PERMANENT: NormalPermanentAlert("行车记录仪模式",
|
||||||
"Car Unrecognized",
|
"车辆未识别",
|
||||||
priority=Priority.LOWEST),
|
priority=Priority.LOWEST),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.aeb: {
|
EventName.aeb: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"BRAKE!",
|
"刹车!",
|
||||||
"Emergency Braking: Risk of Collision",
|
"紧急制动:可能发生碰撞",
|
||||||
AlertStatus.critical, AlertSize.full,
|
AlertStatus.critical, AlertSize.full,
|
||||||
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.),
|
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.),
|
||||||
ET.NO_ENTRY: NoEntryAlert("AEB: Risk of Collision"),
|
ET.NO_ENTRY: NoEntryAlert("AEB:可能发生碰撞"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.stockAeb: {
|
EventName.stockAeb: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"BRAKE!",
|
"刹车!",
|
||||||
"Stock AEB: Risk of Collision",
|
"原厂AEB:可能发生碰撞",
|
||||||
AlertStatus.critical, AlertSize.full,
|
AlertStatus.critical, AlertSize.full,
|
||||||
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.),
|
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.none, 2.),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Stock AEB: Risk of Collision"),
|
ET.NO_ENTRY: NoEntryAlert("原厂AEB:可能发生碰撞"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.fcw: {
|
EventName.fcw: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"BRAKE!",
|
"刹车!",
|
||||||
"Risk of Collision",
|
"可能发生碰撞",
|
||||||
AlertStatus.critical, AlertSize.full,
|
AlertStatus.critical, AlertSize.full,
|
||||||
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.warningSoft, 2.),
|
Priority.HIGHEST, VisualAlert.fcw, AudibleAlert.warningSoft, 2.),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.ldw: {
|
EventName.ldw: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"Lane Departure Detected",
|
"监测偏离车道",
|
||||||
"",
|
"",
|
||||||
AlertStatus.userPrompt, AlertSize.small,
|
AlertStatus.userPrompt, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.),
|
Priority.LOW, VisualAlert.ldw, AudibleAlert.prompt, 3.),
|
||||||
@ -322,7 +329,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.steerTempUnavailableSilent: {
|
EventName.steerTempUnavailableSilent: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Steering Temporarily Unavailable",
|
"转向暂时不可用",
|
||||||
"",
|
"",
|
||||||
AlertStatus.userPrompt, AlertSize.small,
|
AlertStatus.userPrompt, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 1.8),
|
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.prompt, 1.8),
|
||||||
@ -330,7 +337,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.preDriverDistracted: {
|
EventName.preDriverDistracted: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"Pay Attention",
|
"请注意",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
|
||||||
@ -338,23 +345,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.promptDriverDistracted: {
|
EventName.promptDriverDistracted: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"Pay Attention",
|
"请注意",
|
||||||
"Driver Distracted",
|
"驾驶员分心",
|
||||||
AlertStatus.userPrompt, AlertSize.mid,
|
AlertStatus.userPrompt, AlertSize.mid,
|
||||||
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1),
|
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.driverDistracted: {
|
EventName.driverDistracted: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"DISENGAGE IMMEDIATELY",
|
"立即解除控制",
|
||||||
"Driver Distracted",
|
"驾驶员分心",
|
||||||
AlertStatus.critical, AlertSize.full,
|
AlertStatus.critical, AlertSize.full,
|
||||||
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1),
|
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.preDriverUnresponsive: {
|
EventName.preDriverUnresponsive: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"Touch Steering Wheel: No Face Detected",
|
"触摸方向盘:未检测到面部",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1),
|
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.none, .1),
|
||||||
@ -362,31 +369,31 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.promptDriverUnresponsive: {
|
EventName.promptDriverUnresponsive: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"Touch Steering Wheel",
|
"触摸方向盘",
|
||||||
"Driver Unresponsive",
|
"驾驶员无响应",
|
||||||
AlertStatus.userPrompt, AlertSize.mid,
|
AlertStatus.userPrompt, AlertSize.mid,
|
||||||
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1),
|
Priority.MID, VisualAlert.steerRequired, AudibleAlert.promptDistracted, .1),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.driverUnresponsive: {
|
EventName.driverUnresponsive: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"DISENGAGE IMMEDIATELY",
|
"立即解除控制",
|
||||||
"Driver Unresponsive",
|
"驾驶员无响应",
|
||||||
AlertStatus.critical, AlertSize.full,
|
AlertStatus.critical, AlertSize.full,
|
||||||
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1),
|
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.warningImmediate, .1),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.manualRestart: {
|
EventName.manualRestart: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"TAKE CONTROL",
|
"接管控制",
|
||||||
"Resume Driving Manually",
|
"请手动继续驾驶",
|
||||||
AlertStatus.userPrompt, AlertSize.mid,
|
AlertStatus.userPrompt, AlertSize.mid,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.resumeRequired: {
|
EventName.resumeRequired: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Press Resume to Exit Standstill",
|
"按恢复键以解除停止状态",
|
||||||
"",
|
"",
|
||||||
AlertStatus.userPrompt, AlertSize.small,
|
AlertStatus.userPrompt, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
|
||||||
@ -398,7 +405,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.preLaneChangeLeft: {
|
EventName.preLaneChangeLeft: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Steer Left to Start Lane Change Once Safe",
|
"请确认安全后进行左转变道",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
|
||||||
@ -406,7 +413,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.preLaneChangeRight: {
|
EventName.preLaneChangeRight: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Steer Right to Start Lane Change Once Safe",
|
"请确认安全后进行右转变道",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
|
||||||
@ -414,7 +421,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.laneChangeBlocked: {
|
EventName.laneChangeBlocked: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Car Detected in Blindspot",
|
"盲点检测到车辆",
|
||||||
"",
|
"",
|
||||||
AlertStatus.userPrompt, AlertSize.small,
|
AlertStatus.userPrompt, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1),
|
Priority.LOW, VisualAlert.none, AudibleAlert.prompt, .1),
|
||||||
@ -422,7 +429,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.laneChange: {
|
EventName.laneChange: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Changing Lanes",
|
"正在变道",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, .1),
|
||||||
@ -430,41 +437,41 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.steerSaturated: {
|
EventName.steerSaturated: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Take Control",
|
"请接管控制",
|
||||||
"Turn Exceeds Steering Limit",
|
"转向超出限制",
|
||||||
AlertStatus.userPrompt, AlertSize.mid,
|
AlertStatus.userPrompt, AlertSize.mid,
|
||||||
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.),
|
Priority.LOW, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 2.),
|
||||||
},
|
},
|
||||||
|
|
||||||
# Thrown when the fan is driven at >50% but is not rotating
|
# Thrown when the fan is driven at >50% but is not rotating
|
||||||
EventName.fanMalfunction: {
|
EventName.fanMalfunction: {
|
||||||
ET.PERMANENT: NormalPermanentAlert("Fan Malfunction", "Likely Hardware Issue"),
|
ET.PERMANENT: NormalPermanentAlert("风扇故障", "可能是硬件问题"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# Camera is not outputting frames
|
# Camera is not outputting frames
|
||||||
EventName.cameraMalfunction: {
|
EventName.cameraMalfunction: {
|
||||||
ET.PERMANENT: camera_malfunction_alert,
|
ET.PERMANENT: camera_malfunction_alert,
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Camera Malfunction"),
|
ET.SOFT_DISABLE: soft_disable_alert("摄像头故障"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Camera Malfunction: Reboot Your Device"),
|
ET.NO_ENTRY: NoEntryAlert("摄像头故障:请重启设备"),
|
||||||
},
|
},
|
||||||
# Camera framerate too low
|
# Camera framerate too low
|
||||||
EventName.cameraFrameRate: {
|
EventName.cameraFrameRate: {
|
||||||
ET.PERMANENT: NormalPermanentAlert("Camera Frame Rate Low", "Reboot your Device"),
|
ET.PERMANENT: NormalPermanentAlert("摄像头帧率低", "请重启设备"),
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Camera Frame Rate Low"),
|
ET.SOFT_DISABLE: soft_disable_alert("摄像头帧率低"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Camera Frame Rate Low: Reboot Your Device"),
|
ET.NO_ENTRY: NoEntryAlert("摄像头帧率低:请重启设备"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# Unused
|
# Unused
|
||||||
|
|
||||||
EventName.locationdTemporaryError: {
|
EventName.locationdTemporaryError: {
|
||||||
ET.NO_ENTRY: NoEntryAlert("locationd Temporary Error"),
|
ET.NO_ENTRY: NoEntryAlert("locationd临时错误"),
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("locationd Temporary Error"),
|
ET.SOFT_DISABLE: soft_disable_alert("locationd临时错误"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.locationdPermanentError: {
|
EventName.locationdPermanentError: {
|
||||||
ET.NO_ENTRY: NoEntryAlert("locationd Permanent Error"),
|
ET.NO_ENTRY: NoEntryAlert("locationd永久错误"),
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("locationd Permanent Error"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("locationd永久错误"),
|
||||||
ET.PERMANENT: NormalPermanentAlert("locationd Permanent Error"),
|
ET.PERMANENT: NormalPermanentAlert("locationd永久错误"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# openpilot tries to learn certain parameters about your car by observing
|
# 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
|
# bad alignment or bad sensor data. If this happens consistently consider creating an issue on GitHub
|
||||||
EventName.paramsdTemporaryError: {
|
EventName.paramsdTemporaryError: {
|
||||||
ET.NO_ENTRY: paramsd_invalid_alert,
|
ET.NO_ENTRY: paramsd_invalid_alert,
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("paramsd Temporary Error"),
|
ET.SOFT_DISABLE: soft_disable_alert("paramsd 临时错误"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.paramsdPermanentError: {
|
EventName.paramsdPermanentError: {
|
||||||
ET.NO_ENTRY: NoEntryAlert("paramsd Permanent Error"),
|
ET.NO_ENTRY: NoEntryAlert("paramsd永久错误"),
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("paramsd Permanent Error"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("paramsd永久错误"),
|
||||||
ET.PERMANENT: NormalPermanentAlert("paramsd Permanent Error"),
|
ET.PERMANENT: NormalPermanentAlert("paramsd永久错误"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# ********** events that affect controls state transitions **********
|
# ********** events that affect controls state transitions **********
|
||||||
@ -502,12 +509,12 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.buttonCancel: {
|
EventName.buttonCancel: {
|
||||||
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Cancel Pressed"),
|
ET.NO_ENTRY: NoEntryAlert("取消按钮被按下"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.brakeHold: {
|
EventName.brakeHold: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Press Resume to Exit Brake Hold",
|
"按恢复键以解除制动保持",
|
||||||
"",
|
"",
|
||||||
AlertStatus.userPrompt, AlertSize.small,
|
AlertStatus.userPrompt, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, .2),
|
||||||
@ -515,23 +522,23 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.parkBrake: {
|
EventName.parkBrake: {
|
||||||
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Parking Brake Engaged"),
|
ET.NO_ENTRY: NoEntryAlert("停车制动已启用"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.pedalPressed: {
|
EventName.pedalPressed: {
|
||||||
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Pedal Pressed",
|
ET.NO_ENTRY: NoEntryAlert("踏板被按下",
|
||||||
visual_alert=VisualAlert.brakePressed),
|
visual_alert=VisualAlert.brakePressed),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.steerDisengage: {
|
EventName.steerDisengage: {
|
||||||
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Steering Pressed"),
|
ET.NO_ENTRY: NoEntryAlert("方向盘被转动"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.preEnableStandstill: {
|
EventName.preEnableStandstill: {
|
||||||
ET.PRE_ENABLE: Alert(
|
ET.PRE_ENABLE: Alert(
|
||||||
"Release Brake to Engage",
|
"释放制动以启用",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1, creation_delay=1.),
|
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .1, creation_delay=1.),
|
||||||
@ -559,27 +566,27 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
EventName.resumeBlocked: {
|
EventName.resumeBlocked: {
|
||||||
ET.NO_ENTRY: NoEntryAlert("Press Set to Engage"),
|
ET.NO_ENTRY: NoEntryAlert("请按设定键以启用"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.wrongCruiseMode: {
|
EventName.wrongCruiseMode: {
|
||||||
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
ET.USER_DISABLE: EngagementAlert(AudibleAlert.disengage),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Adaptive Cruise Disabled"),
|
ET.NO_ENTRY: NoEntryAlert("自适应巡航已禁用"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.steerTempUnavailable: {
|
EventName.steerTempUnavailable: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Steering Temporarily Unavailable"),
|
ET.SOFT_DISABLE: soft_disable_alert("转向暂时不可用"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Steering Temporarily Unavailable"),
|
ET.NO_ENTRY: NoEntryAlert("转向暂时不可用"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.steerTimeLimit: {
|
EventName.steerTimeLimit: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Vehicle Steering Time Limit"),
|
ET.SOFT_DISABLE: soft_disable_alert("车辆转向时间限制"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Vehicle Steering Time Limit"),
|
ET.NO_ENTRY: NoEntryAlert("车辆转向时间限制"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.outOfSpace: {
|
EventName.outOfSpace: {
|
||||||
ET.PERMANENT: out_of_space_alert,
|
ET.PERMANENT: out_of_space_alert,
|
||||||
ET.NO_ENTRY: NoEntryAlert("Out of Storage"),
|
ET.NO_ENTRY: NoEntryAlert("出库"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.belowEngageSpeed: {
|
EventName.belowEngageSpeed: {
|
||||||
@ -588,19 +595,19 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.sensorDataInvalid: {
|
EventName.sensorDataInvalid: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"Sensor Data Invalid",
|
"传感器数据无效",
|
||||||
"Possible Hardware Issue",
|
"可能是硬件问题",
|
||||||
AlertStatus.normal, AlertSize.mid,
|
AlertStatus.normal, AlertSize.mid,
|
||||||
Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2, creation_delay=1.),
|
Priority.LOWER, VisualAlert.none, AudibleAlert.none, .2, creation_delay=1.),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Sensor Data Invalid"),
|
ET.NO_ENTRY: NoEntryAlert("传感器数据无效"),
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Sensor Data Invalid"),
|
ET.SOFT_DISABLE: soft_disable_alert("传感器数据无效"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.noGps: {
|
EventName.noGps: {
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.tooDistracted: {
|
EventName.tooDistracted: {
|
||||||
ET.NO_ENTRY: NoEntryAlert("Distraction Level Too High"),
|
ET.NO_ENTRY: NoEntryAlert("注意力分散程度过高"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.excessiveActuation: {
|
EventName.excessiveActuation: {
|
||||||
@ -610,13 +617,13 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventName.overheat: {
|
EventName.overheat: {
|
||||||
ET.PERMANENT: overheat_alert,
|
ET.PERMANENT: overheat_alert,
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("System Overheated"),
|
ET.SOFT_DISABLE: soft_disable_alert("系统过热"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("System Overheated"),
|
ET.NO_ENTRY: NoEntryAlert("系统过热"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.wrongGear: {
|
EventName.wrongGear: {
|
||||||
ET.SOFT_DISABLE: user_soft_disable_alert("Gear not D"),
|
ET.SOFT_DISABLE: user_soft_disable_alert("挡位不在D挡"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Gear not D"),
|
ET.NO_ENTRY: NoEntryAlert("挡位不在D挡"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# This alert is thrown when the calibration angles are outside of the acceptable range.
|
# 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
|
# See https://comma.ai/setup for more information
|
||||||
EventName.calibrationInvalid: {
|
EventName.calibrationInvalid: {
|
||||||
ET.PERMANENT: calibration_invalid_alert,
|
ET.PERMANENT: calibration_invalid_alert,
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Calibration Invalid: Remount Device & Recalibrate"),
|
ET.SOFT_DISABLE: soft_disable_alert("校准无效:重新安装设备并重新校准"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Calibration Invalid: Remount Device & Recalibrate"),
|
ET.NO_ENTRY: NoEntryAlert("校准无效:重新安装设备并重新校准"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.calibrationIncomplete: {
|
EventName.calibrationIncomplete: {
|
||||||
ET.PERMANENT: calibration_incomplete_alert,
|
ET.PERMANENT: calibration_incomplete_alert,
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Calibration Incomplete"),
|
ET.SOFT_DISABLE: soft_disable_alert("校准未完成"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Calibration in Progress"),
|
ET.NO_ENTRY: NoEntryAlert("校准进行中"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.calibrationRecalibrating: {
|
EventName.calibrationRecalibrating: {
|
||||||
ET.PERMANENT: calibration_incomplete_alert,
|
ET.PERMANENT: calibration_incomplete_alert,
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Device Remount Detected: Recalibrating"),
|
ET.SOFT_DISABLE: soft_disable_alert("设备重新安装检测到:重新校准中"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Remount Detected: Recalibrating"),
|
ET.NO_ENTRY: NoEntryAlert("设备重新安装检测到:重新校准中"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.doorOpen: {
|
EventName.doorOpen: {
|
||||||
ET.SOFT_DISABLE: user_soft_disable_alert("Door Open"),
|
ET.SOFT_DISABLE: user_soft_disable_alert("车门开启"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Door Open"),
|
ET.NO_ENTRY: NoEntryAlert("车门开启"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.seatbeltNotLatched: {
|
EventName.seatbeltNotLatched: {
|
||||||
ET.SOFT_DISABLE: user_soft_disable_alert("Seatbelt Unlatched"),
|
ET.SOFT_DISABLE: user_soft_disable_alert("安全带未系"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Seatbelt Unlatched"),
|
ET.NO_ENTRY: NoEntryAlert("安全带未系"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.espDisabled: {
|
EventName.espDisabled: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Disabled"),
|
ET.SOFT_DISABLE: soft_disable_alert("电子稳定控制系统已禁用"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Disabled"),
|
ET.NO_ENTRY: NoEntryAlert("电子稳定控制系统已禁用"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.lowBattery: {
|
EventName.lowBattery: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Low Battery"),
|
ET.SOFT_DISABLE: soft_disable_alert("电池电量低"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Low Battery"),
|
ET.NO_ENTRY: NoEntryAlert("电池电量低"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# Different openpilot services communicate between each other at a certain
|
# 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
|
# 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.
|
# ten times the regular interval, or the average interval is more than 10% too high.
|
||||||
EventName.commIssue: {
|
EventName.commIssue: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Communication Issue Between Processes"),
|
ET.SOFT_DISABLE: soft_disable_alert("进程间通信问题"),
|
||||||
ET.NO_ENTRY: comm_issue_alert,
|
ET.NO_ENTRY: comm_issue_alert,
|
||||||
},
|
},
|
||||||
EventName.commIssueAvgFreq: {
|
EventName.commIssueAvgFreq: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Low Communication Rate Between Processes"),
|
ET.SOFT_DISABLE: soft_disable_alert("进程间通信速率低"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Low Communication Rate Between Processes"),
|
ET.NO_ENTRY: NoEntryAlert("进程间通信速率低"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.selfdrivedLagging: {
|
EventName.selfdrivedLagging: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("System Lagging"),
|
ET.SOFT_DISABLE: soft_disable_alert("系统滞后"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Selfdrive Process Lagging: Reboot Your Device"),
|
ET.NO_ENTRY: NoEntryAlert("自驾车进程滞后:请重启设备"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# Thrown when manager detects a service exited unexpectedly while driving
|
# Thrown when manager detects a service exited unexpectedly while driving
|
||||||
EventName.processNotRunning: {
|
EventName.processNotRunning: {
|
||||||
ET.NO_ENTRY: process_not_running_alert,
|
ET.NO_ENTRY: process_not_running_alert,
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Process Not Running"),
|
ET.SOFT_DISABLE: soft_disable_alert("进程未运行"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.radarFault: {
|
EventName.radarFault: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Radar Error: Restart the Car"),
|
ET.SOFT_DISABLE: soft_disable_alert("雷达错误:请重启车辆"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Radar Error: Restart the Car"),
|
ET.NO_ENTRY: NoEntryAlert("雷达错误:请重启车辆"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.radarTempUnavailable: {
|
EventName.radarTempUnavailable: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Radar Temporarily Unavailable"),
|
ET.SOFT_DISABLE: soft_disable_alert("雷达暂时不可用"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Radar Temporarily Unavailable"),
|
ET.NO_ENTRY: NoEntryAlert("雷达暂时不可用"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# Every frame from the camera should be processed by the model. If modeld
|
# 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
|
# is not processing frames fast enough they have to be dropped. This alert is
|
||||||
# thrown when over 20% of frames are dropped.
|
# thrown when over 20% of frames are dropped.
|
||||||
EventName.modeldLagging: {
|
EventName.modeldLagging: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Driving Model Lagging"),
|
ET.SOFT_DISABLE: soft_disable_alert("驾驶模型滞后"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Driving Model Lagging"),
|
ET.NO_ENTRY: NoEntryAlert("驾驶模型滞后"),
|
||||||
ET.PERMANENT: modeld_lagging_alert,
|
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
|
# usually means the model has trouble understanding the scene. This is used
|
||||||
# as a heuristic to warn the driver.
|
# as a heuristic to warn the driver.
|
||||||
EventName.posenetInvalid: {
|
EventName.posenetInvalid: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Posenet Speed Invalid"),
|
ET.SOFT_DISABLE: soft_disable_alert("Posenet速度无效"),
|
||||||
ET.NO_ENTRY: posenet_invalid_alert,
|
ET.NO_ENTRY: posenet_invalid_alert,
|
||||||
},
|
},
|
||||||
|
|
||||||
# When the localizer detects an acceleration of more than 40 m/s^2 (~4G) we
|
# 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.
|
# alert the driver the device might have fallen from the windshield.
|
||||||
EventName.deviceFalling: {
|
EventName.deviceFalling: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Device Fell Off Mount"),
|
ET.SOFT_DISABLE: soft_disable_alert("设备从支架掉落"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Device Fell Off Mount"),
|
ET.NO_ENTRY: NoEntryAlert("设备从支架掉落"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.lowMemory: {
|
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.PERMANENT: low_memory_alert,
|
||||||
ET.NO_ENTRY: NoEntryAlert("Low Memory: Reboot Your Device"),
|
ET.NO_ENTRY: NoEntryAlert("内存不足:请重启设备"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.accFaulted: {
|
EventName.accFaulted: {
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Cruise Fault: Restart the Car"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("巡航故障:请重启车辆"),
|
||||||
ET.PERMANENT: NormalPermanentAlert("Cruise Fault: Restart the car to engage"),
|
ET.PERMANENT: NormalPermanentAlert("巡航故障:重启车辆以启用"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Cruise Fault: Restart the Car"),
|
ET.NO_ENTRY: NoEntryAlert("巡航故障:请重启车辆"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.espActive: {
|
EventName.espActive: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("Electronic Stability Control Active"),
|
ET.SOFT_DISABLE: soft_disable_alert("电子稳定控制系统激活中"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Electronic Stability Control Active"),
|
ET.NO_ENTRY: NoEntryAlert("电子稳定控制系统激活中"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.controlsMismatch: {
|
EventName.controlsMismatch: {
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("控制不匹配"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Controls Mismatch"),
|
ET.NO_ENTRY: NoEntryAlert("控制不匹配"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# Sometimes the USB stack on the device can get into a bad state
|
# Sometimes the USB stack on the device can get into a bad state
|
||||||
# causing the connection to the panda to be lost
|
# causing the connection to the panda to be lost
|
||||||
EventName.usbError: {
|
EventName.usbError: {
|
||||||
ET.SOFT_DISABLE: soft_disable_alert("USB Error: Reboot Your Device"),
|
ET.SOFT_DISABLE: soft_disable_alert("USB错误:请重启设备"),
|
||||||
ET.PERMANENT: NormalPermanentAlert("USB Error: Reboot Your Device"),
|
ET.PERMANENT: NormalPermanentAlert("USB错误:请重启设备"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("USB Error: Reboot Your Device"),
|
ET.NO_ENTRY: NoEntryAlert("USB错误:请重启设备"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# This alert can be thrown for the following reasons:
|
# 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
|
# - 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
|
# If you're not writing a new car port, this is usually cause by faulty wiring
|
||||||
EventName.canError: {
|
EventName.canError: {
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Error"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN总线错误"),
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"CAN Error: Check Connections",
|
"CAN总线错误:请检查连接",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
|
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: {
|
EventName.canBusMissing: {
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN Bus Disconnected"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("CAN总线断开连接"),
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"CAN Bus Disconnected: Likely Faulty Cable",
|
"CAN总线断开连接:可能电缆故障",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1., creation_delay=1.),
|
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: {
|
EventName.steerUnavailable: {
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS Fault: Restart the Car"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("LKAS故障:请重启车辆"),
|
||||||
ET.PERMANENT: NormalPermanentAlert("LKAS Fault: Restart the car to engage"),
|
ET.PERMANENT: NormalPermanentAlert("LKAS故障:重启车辆以启用"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("LKAS Fault: Restart the Car"),
|
ET.NO_ENTRY: NoEntryAlert("LKAS故障:请重启车辆"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.reverseGear: {
|
EventName.reverseGear: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"Reverse\nGear",
|
"倒车中",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.full,
|
AlertStatus.normal, AlertSize.full,
|
||||||
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5),
|
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5),
|
||||||
ET.USER_DISABLE: ImmediateDisableAlert("Reverse Gear"),
|
ET.USER_DISABLE: ImmediateDisableAlert("倒档"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Reverse Gear"),
|
ET.NO_ENTRY: NoEntryAlert("倒档"),
|
||||||
},
|
},
|
||||||
|
|
||||||
# On cars that use stock ACC the car can decide to cancel ACC for various reasons.
|
# 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.
|
# When this happens we can no long control the car so the user needs to be warned immediately.
|
||||||
EventName.cruiseDisabled: {
|
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
|
# 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
|
# are received on the car side this usually means the relay hasn't opened correctly
|
||||||
# and this alert is thrown.
|
# and this alert is thrown.
|
||||||
EventName.relayMalfunction: {
|
EventName.relayMalfunction: {
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Harness Relay Malfunction"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("线束继电器故障"),
|
||||||
ET.PERMANENT: NormalPermanentAlert("Harness Relay Malfunction", "Check Hardware"),
|
ET.PERMANENT: NormalPermanentAlert("线束继电器故障", "检查硬件"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Harness Relay Malfunction"),
|
ET.NO_ENTRY: NoEntryAlert("线束继电器故障"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.speedTooLow: {
|
EventName.speedTooLow: {
|
||||||
ET.IMMEDIATE_DISABLE: Alert(
|
ET.IMMEDIATE_DISABLE: Alert(
|
||||||
"openpilot Canceled",
|
"openpilot已取消",
|
||||||
"Speed too low",
|
"速度过低",
|
||||||
AlertStatus.normal, AlertSize.mid,
|
AlertStatus.normal, AlertSize.mid,
|
||||||
Priority.HIGH, VisualAlert.none, AudibleAlert.disengage, 3.),
|
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.
|
# When the car is driving faster than most cars in the training data, the model outputs can be unpredictable.
|
||||||
EventName.speedTooHigh: {
|
EventName.speedTooHigh: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Speed Too High",
|
"速度过高",
|
||||||
"Model uncertain at this speed",
|
"在此速度下模型不稳定",
|
||||||
AlertStatus.userPrompt, AlertSize.mid,
|
AlertStatus.userPrompt, AlertSize.mid,
|
||||||
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 4.),
|
Priority.HIGH, VisualAlert.steerRequired, AudibleAlert.promptRepeat, 4.),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Slow down to engage"),
|
ET.NO_ENTRY: NoEntryAlert("减速以进行接合"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.vehicleSensorsInvalid: {
|
EventName.vehicleSensorsInvalid: {
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Vehicle Sensors Invalid"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("车辆传感器无效"),
|
||||||
ET.PERMANENT: NormalPermanentAlert("Vehicle Sensors Calibrating", "Drive to Calibrate"),
|
ET.PERMANENT: NormalPermanentAlert("车辆传感器校准中", "行驶以校准"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Vehicle Sensors Calibrating"),
|
ET.NO_ENTRY: NoEntryAlert("车辆传感器校准中"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.personalityChanged: {
|
EventName.personalityChanged: {
|
||||||
@ -837,7 +844,7 @@ EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
EventName.userBookmark: {
|
EventName.userBookmark: {
|
||||||
ET.PERMANENT: NormalPermanentAlert("Bookmark Saved", duration=1.5),
|
ET.PERMANENT: NormalPermanentAlert("书签已保存", duration=1.5),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventName.audioFeedback: {
|
EventName.audioFeedback: {
|
||||||
|
|||||||
@ -22,7 +22,6 @@ from openpilot.selfdrive.selfdrived.state import StateMachine
|
|||||||
from openpilot.selfdrive.selfdrived.alertmanager import AlertManager, set_offroad_alert
|
from openpilot.selfdrive.selfdrived.alertmanager import AlertManager, set_offroad_alert
|
||||||
|
|
||||||
from openpilot.system.hardware import HARDWARE
|
from openpilot.system.hardware import HARDWARE
|
||||||
from openpilot.system.version import get_build_metadata
|
|
||||||
|
|
||||||
from openpilot.sunnypilot.mads.mads import ModularAssistiveDrivingSystem
|
from openpilot.sunnypilot.mads.mads import ModularAssistiveDrivingSystem
|
||||||
from openpilot.sunnypilot.selfdrive.car.car_specific import CarSpecificEventsSP
|
from openpilot.sunnypilot.selfdrive.car.car_specific import CarSpecificEventsSP
|
||||||
@ -51,9 +50,6 @@ class SelfdriveD(CruiseHelper):
|
|||||||
def __init__(self, CP=None, CP_SP=None):
|
def __init__(self, CP=None, CP_SP=None):
|
||||||
self.params = Params()
|
self.params = Params()
|
||||||
|
|
||||||
# Ensure the current branch is cached, otherwise the first cycle lags
|
|
||||||
build_metadata = get_build_metadata()
|
|
||||||
|
|
||||||
if CP is None:
|
if CP is None:
|
||||||
cloudlog.info("selfdrived is waiting for CarParams")
|
cloudlog.info("selfdrived is waiting for CarParams")
|
||||||
self.CP = messaging.log_from_bytes(self.params.get("CarParams", block=True), car.CarParams)
|
self.CP = messaging.log_from_bytes(self.params.get("CarParams", block=True), car.CarParams)
|
||||||
@ -144,8 +140,7 @@ class SelfdriveD(CruiseHelper):
|
|||||||
self.ignored_processes.update({'mapd'})
|
self.ignored_processes.update({'mapd'})
|
||||||
|
|
||||||
# Determine startup event
|
# Determine startup event
|
||||||
is_remote = build_metadata.openpilot.comma_remote or build_metadata.openpilot.sunnypilot_remote
|
self.startup_event = EventName.startup
|
||||||
self.startup_event = EventName.startup if is_remote and build_metadata.tested_channel else EventName.startupMaster
|
|
||||||
if not car_recognized:
|
if not car_recognized:
|
||||||
self.startup_event = EventName.startupNoCar
|
self.startup_event = EventName.startupNoCar
|
||||||
elif car_recognized and self.CP.passive:
|
elif car_recognized and self.CP.passive:
|
||||||
|
|||||||
@ -12,7 +12,7 @@ import requests
|
|||||||
TRANSLATIONS_DIR = pathlib.Path(__file__).resolve().parent
|
TRANSLATIONS_DIR = pathlib.Path(__file__).resolve().parent
|
||||||
TRANSLATIONS_LANGUAGES = TRANSLATIONS_DIR / "languages.json"
|
TRANSLATIONS_LANGUAGES = TRANSLATIONS_DIR / "languages.json"
|
||||||
|
|
||||||
OPENAI_MODEL = "gpt-4"
|
OPENAI_MODEL = "deepseek-chat"
|
||||||
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
|
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
|
||||||
OPENAI_PROMPT = "You are a professional translator from English to {language} (ISO 639 language code). " + \
|
OPENAI_PROMPT = "You are a professional translator from English to {language} (ISO 639 language code). " + \
|
||||||
"The following sentence or word is in the GUI of a software called openpilot, translate it accordingly."
|
"The following sentence or word is in the GUI of a software called openpilot, translate it accordingly."
|
||||||
@ -36,7 +36,7 @@ def get_language_files(languages: list[str] = None) -> dict[str, pathlib.Path]:
|
|||||||
|
|
||||||
def translate_phrase(text: str, language: str) -> str:
|
def translate_phrase(text: str, language: str) -> str:
|
||||||
response = requests.post(
|
response = requests.post(
|
||||||
"https://api.openai.com/v1/chat/completions",
|
"https://api.deepseek.com/chat/completions",
|
||||||
json={
|
json={
|
||||||
"model": OPENAI_MODEL,
|
"model": OPENAI_MODEL,
|
||||||
"messages": [
|
"messages": [
|
||||||
@ -96,6 +96,7 @@ def translate_file(path: pathlib.Path, language: str, all_: bool) -> None:
|
|||||||
f"LLM translation: {llm_translation}")
|
f"LLM translation: {llm_translation}")
|
||||||
|
|
||||||
translation.text = llm_translation
|
translation.text = llm_translation
|
||||||
|
translation.set("type", f"{OPENAI_MODEL}")
|
||||||
|
|
||||||
with path.open("w", encoding="utf-8") as fp:
|
with path.open("w", encoding="utf-8") as fp:
|
||||||
fp.write('<?xml version="1.0" encoding="utf-8"?>\n' +
|
fp.write('<?xml version="1.0" encoding="utf-8"?>\n' +
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -0,0 +1 @@
|
|||||||
|
{"input_std":[[9.668097],[1.5244726],[1.2700657],[0.03216253],[1.6078212],[1.5848233],[1.5577372],[1.3927742],[1.2935301],[1.1931615],[1.1020583],[0.032136116],[0.03217024],[0.032196537],[0.03225218],[0.032214258],[0.032031752],[0.03179372]],"model_test_loss":0.018995385617017746,"input_size":18,"current_date_and_time":"2025-05-15_14-47-45","input_mean":[[18.09652],[-0.017798662],[0.027145168],[-0.0054331655],[-0.025215305],[-0.022640774],[-0.019500963],[-0.010056124],[-0.0057649272],[0.001960505],[0.0020118994],[-0.005499858],[-0.005477372],[-0.005444631],[-0.0053683305],[-0.005257134],[-0.005035867],[-0.0050971555]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.016405884],[1.4187009],[-0.30671495],[-1.4047697],[-0.20383339],[-0.3632745],[-0.028944347]],"dense_1_W":[[0.13070685,-0.6662394,-1.0739188,-0.41523784,0.019285621,-0.5666617,0.02941118,0.2413377,0.11430891,-0.15557496,-0.36541316,0.44118378,0.038414165,0.117383294,-0.026998837,-0.3802126,-0.23443018,0.43427357],[0.5493235,0.7341044,0.30259728,-0.09170222,-0.066015296,0.41798133,-0.062179696,-0.1925674,-0.15322368,0.017662844,0.21162434,-0.12112619,-0.027021965,0.05653779,0.14749303,0.28017008,-0.15880422,-0.07834965],[1.3052936,-0.038109165,1.2192534,-0.18676366,0.21888737,0.45998427,0.94506985,-0.87686205,0.044812016,-0.07512292,0.69492793,-0.59623814,0.3278255,0.39913544,0.15354112,0.04995451,-0.031020898,-0.10582342],[-0.4683151,1.0002598,0.29120648,-0.05860625,0.010191997,0.17896307,-0.3321235,0.19332078,-0.44497126,0.09236495,0.17685813,0.022076255,-0.23972619,0.11622197,0.11574386,0.1640551,0.028836682,-0.14775941],[1.2240227,0.5504716,-1.161672,0.10151114,-0.6311718,-0.4365897,-0.63896364,0.4033335,0.012773022,0.025944846,-0.62420815,0.05751297,0.043608528,-0.13193272,-0.33345297,0.18925929,0.0925279,-0.03600548],[-0.0033800902,-0.41361037,-8.50345,0.27523437,2.0881453,2.3587928,2.1091182,-2.467406,-1.9167688,-0.8961217,-0.22510983,0.037862107,-0.23643681,0.03247474,0.067485854,0.04660773,-0.2583531,0.077512406],[0.0035197088,-0.43985325,0.07051937,0.38219255,-0.67769414,-0.29911998,1.0818627,-0.6217103,-0.5443828,0.22882973,0.013560748,-0.29820752,0.11540977,-0.40309906,-0.00034299958,0.69976795,0.13301164,-0.32934943]],"activation":"σ"},{"dense_2_W":[[-0.014842439,-0.3306524,0.254514,-0.6639507,-0.534733,0.07840164,0.2324318],[-0.15334646,-0.290343,-1.047474,0.41780674,0.04612693,-0.73001504,-0.3465528],[-0.6260714,-0.5115335,-0.71161246,0.4046027,-1.2324069,-1.2851475,-0.16620061],[-0.05566019,0.48536706,-0.42460826,0.83332616,0.47045597,-0.061004266,-1.1440438],[0.42156544,-0.6722497,-0.10824958,-0.32994938,0.31952205,-0.46266714,-0.07230821],[-0.38416666,-0.7271572,-0.39645803,-0.4259647,-0.24740903,-0.17667961,-0.10970643],[0.19652602,0.026280575,-0.1651507,-0.38475782,-0.5457258,-0.1882665,0.82107437],[-0.08976335,0.35238677,0.25231764,0.004611504,-0.5936927,-0.29342756,-0.22477138],[0.25490662,-0.4851788,-0.07538396,-0.36808714,-0.05157315,-0.2439695,0.9720866],[0.48479185,-0.68759876,0.42557424,-0.56957704,-0.32759178,-0.3047872,0.7597776],[0.4211342,-1.4932247,-0.66635305,-0.10591562,-0.9298172,1.04872,0.32208702],[-0.2918295,0.63893354,0.044817235,0.87641054,0.38387123,-0.48429132,-0.8803729],[-0.60936576,-0.29061803,-0.94329685,0.6586833,0.15280105,-0.8124564,-0.538523]],"activation":"σ","dense_2_b":[[-0.009386154],[-0.25074136],[0.02986496],[-0.028872054],[-0.06481484],[-0.2976481],[-0.072934344],[-0.117011935],[0.028236326],[-0.009000545],[-0.42297846],[0.030614687],[-0.105583444]]},{"dense_3_W":[[-0.035136532,-0.27008098,-0.5048698,-0.5295355,0.29823285,0.5058221,-0.09186966,0.26433602,0.50751793,0.49806535,0.8154631,-0.5854975,-0.525581],[0.08374179,0.16962804,0.2263017,0.5973136,0.2815238,-0.0505521,0.26001385,0.36577544,-0.68805265,-0.8057493,-0.42594707,0.633128,0.08724391],[0.5107981,0.064214274,-0.061156582,-0.33331737,0.07700428,-0.40398338,0.3673148,-0.42669702,0.38095382,0.33056983,-0.3025643,-0.58125204,-0.3484819]],"activation":"identity","dense_3_b":[[0.01880667],[-0.04986152],[0.030190725]]},{"dense_4_W":[[-1.0120764,0.477425,-1.0690569]],"dense_4_b":[[-0.027314244]],"activation":"identity"}]}
|
||||||
@ -41,16 +41,16 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventNameSP.manualSteeringRequired: {
|
EventNameSP.manualSteeringRequired: {
|
||||||
ET.USER_DISABLE: Alert(
|
ET.USER_DISABLE: Alert(
|
||||||
"Automatic Lane Centering is OFF",
|
"自动车道居中功能已关闭",
|
||||||
"Manual Steering Required",
|
"需要手动转向",
|
||||||
AlertStatus.normal, AlertSize.mid,
|
AlertStatus.normal, AlertSize.mid,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.disengage, 1.),
|
Priority.LOW, VisualAlert.none, AudibleAlert.disengage, 1.),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.manualLongitudinalRequired: {
|
EventNameSP.manualLongitudinalRequired: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Smart/Adaptive Cruise Control: OFF",
|
"智能/自适应巡航控制:关闭",
|
||||||
"Manual Speed Control Required",
|
"需要手动速度控制",
|
||||||
AlertStatus.normal, AlertSize.mid,
|
AlertStatus.normal, AlertSize.mid,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
|
||||||
},
|
},
|
||||||
@ -65,7 +65,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventNameSP.silentBrakeHold: {
|
EventNameSP.silentBrakeHold: {
|
||||||
ET.WARNING: EngagementAlert(AudibleAlert.none),
|
ET.WARNING: EngagementAlert(AudibleAlert.none),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Brake Hold Active"),
|
ET.NO_ENTRY: NoEntryAlert("刹车保持激活"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.silentWrongGear: {
|
EventNameSP.silentWrongGear: {
|
||||||
@ -75,19 +75,19 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
AlertStatus.normal, AlertSize.none,
|
AlertStatus.normal, AlertSize.none,
|
||||||
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
|
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
|
||||||
ET.NO_ENTRY: Alert(
|
ET.NO_ENTRY: Alert(
|
||||||
"Gear not D",
|
"档位不在D档",
|
||||||
"openpilot Unavailable",
|
"openpilot不可用",
|
||||||
AlertStatus.normal, AlertSize.mid,
|
AlertStatus.normal, AlertSize.mid,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, 0.),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, 0.),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.silentReverseGear: {
|
EventNameSP.silentReverseGear: {
|
||||||
ET.PERMANENT: Alert(
|
ET.PERMANENT: Alert(
|
||||||
"Reverse\nGear",
|
"倒车中",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.full,
|
AlertStatus.normal, AlertSize.full,
|
||||||
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5),
|
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, .2, creation_delay=0.5),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Reverse Gear"),
|
ET.NO_ENTRY: NoEntryAlert("倒车中"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.silentDoorOpen: {
|
EventNameSP.silentDoorOpen: {
|
||||||
@ -96,7 +96,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.none,
|
AlertStatus.normal, AlertSize.none,
|
||||||
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
|
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Door Open"),
|
ET.NO_ENTRY: NoEntryAlert("车门已打开"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.silentSeatbeltNotLatched: {
|
EventNameSP.silentSeatbeltNotLatched: {
|
||||||
@ -105,7 +105,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.none,
|
AlertStatus.normal, AlertSize.none,
|
||||||
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
|
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Seatbelt Unlatched"),
|
ET.NO_ENTRY: NoEntryAlert("请系好安全带"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.silentParkBrake: {
|
EventNameSP.silentParkBrake: {
|
||||||
@ -114,16 +114,16 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.none,
|
AlertStatus.normal, AlertSize.none,
|
||||||
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
|
Priority.LOWEST, VisualAlert.none, AudibleAlert.none, 0.),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Parking Brake Engaged"),
|
ET.NO_ENTRY: NoEntryAlert("手刹已启用"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.controlsMismatchLateral: {
|
EventNameSP.controlsMismatchLateral: {
|
||||||
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("Controls Mismatch: Lateral"),
|
ET.IMMEDIATE_DISABLE: ImmediateDisableAlert("控制装置不匹配:横向"),
|
||||||
ET.NO_ENTRY: NoEntryAlert("Controls Mismatch: Lateral"),
|
ET.NO_ENTRY: NoEntryAlert("控制装置不匹配:横向"),
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.experimentalModeSwitched: {
|
EventNameSP.experimentalModeSwitched: {
|
||||||
ET.WARNING: NormalPermanentAlert("Experimental Mode Switched", duration=1.5)
|
ET.WARNING: NormalPermanentAlert("实验模式切换", duration=1.5)
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.wrongCarModeAlertOnly: {
|
EventNameSP.wrongCarModeAlertOnly: {
|
||||||
@ -131,12 +131,12 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.pedalPressedAlertOnly: {
|
EventNameSP.pedalPressedAlertOnly: {
|
||||||
ET.WARNING: NoEntryAlert("Pedal Pressed")
|
ET.WARNING: NoEntryAlert("踏板被踩下")
|
||||||
},
|
},
|
||||||
|
|
||||||
EventNameSP.laneTurnLeft: {
|
EventNameSP.laneTurnLeft: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Turning Left",
|
"左转",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
|
||||||
@ -144,7 +144,7 @@ EVENTS_SP: dict[int, dict[str, Alert | AlertCallbackType]] = {
|
|||||||
|
|
||||||
EventNameSP.laneTurnRight: {
|
EventNameSP.laneTurnRight: {
|
||||||
ET.WARNING: Alert(
|
ET.WARNING: Alert(
|
||||||
"Turning Right",
|
"右转",
|
||||||
"",
|
"",
|
||||||
AlertStatus.normal, AlertSize.small,
|
AlertStatus.normal, AlertSize.small,
|
||||||
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
|
Priority.LOW, VisualAlert.none, AudibleAlert.none, 1.),
|
||||||
|
|||||||
@ -87,9 +87,9 @@ AlertCallbackType = Callable[[car.CarParams, car.CarState, messaging.SubMaster,
|
|||||||
|
|
||||||
|
|
||||||
def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
|
def wrong_car_mode_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
|
||||||
text = "Enable Adaptive Cruise to Engage"
|
text = "启用自适应巡航"
|
||||||
if CP.brand == "honda":
|
if CP.brand == "honda":
|
||||||
text = "Enable Main Switch to Engage"
|
text = "启用主开关"
|
||||||
return NoEntryAlert(text)
|
return NoEntryAlert(text)
|
||||||
|
|
||||||
|
|
||||||
@ -183,7 +183,7 @@ EmptyAlert = Alert("" , "", AlertStatus.normal, AlertSize.none, Priority.LOWEST,
|
|||||||
|
|
||||||
class NoEntryAlert(Alert):
|
class NoEntryAlert(Alert):
|
||||||
def __init__(self, alert_text_2: str,
|
def __init__(self, alert_text_2: str,
|
||||||
alert_text_1: str = "openpilot Unavailable",
|
alert_text_1: str = "openpilot不可用",
|
||||||
visual_alert: car.CarControl.HUDControl.VisualAlert=VisualAlert.none):
|
visual_alert: car.CarControl.HUDControl.VisualAlert=VisualAlert.none):
|
||||||
super().__init__(alert_text_1, alert_text_2, AlertStatus.normal,
|
super().__init__(alert_text_1, alert_text_2, AlertStatus.normal,
|
||||||
AlertSize.mid, Priority.LOW, visual_alert,
|
AlertSize.mid, Priority.LOW, visual_alert,
|
||||||
@ -192,7 +192,7 @@ class NoEntryAlert(Alert):
|
|||||||
|
|
||||||
class SoftDisableAlert(Alert):
|
class SoftDisableAlert(Alert):
|
||||||
def __init__(self, alert_text_2: str):
|
def __init__(self, alert_text_2: str):
|
||||||
super().__init__("TAKE CONTROL IMMEDIATELY", alert_text_2,
|
super().__init__("立即控制", alert_text_2,
|
||||||
AlertStatus.userPrompt, AlertSize.full,
|
AlertStatus.userPrompt, AlertSize.full,
|
||||||
Priority.MID, VisualAlert.steerRequired,
|
Priority.MID, VisualAlert.steerRequired,
|
||||||
AudibleAlert.warningSoft, 2.),
|
AudibleAlert.warningSoft, 2.),
|
||||||
@ -202,12 +202,12 @@ class SoftDisableAlert(Alert):
|
|||||||
class UserSoftDisableAlert(SoftDisableAlert):
|
class UserSoftDisableAlert(SoftDisableAlert):
|
||||||
def __init__(self, alert_text_2: str):
|
def __init__(self, alert_text_2: str):
|
||||||
super().__init__(alert_text_2),
|
super().__init__(alert_text_2),
|
||||||
self.alert_text_1 = "openpilot will disengage"
|
self.alert_text_1 = "openpilot将停止工作"
|
||||||
|
|
||||||
|
|
||||||
class ImmediateDisableAlert(Alert):
|
class ImmediateDisableAlert(Alert):
|
||||||
def __init__(self, alert_text_2: str):
|
def __init__(self, alert_text_2: str):
|
||||||
super().__init__("TAKE CONTROL IMMEDIATELY", alert_text_2,
|
super().__init__("立即掌控", alert_text_2,
|
||||||
AlertStatus.critical, AlertSize.full,
|
AlertStatus.critical, AlertSize.full,
|
||||||
Priority.HIGHEST, VisualAlert.steerRequired,
|
Priority.HIGHEST, VisualAlert.steerRequired,
|
||||||
AudibleAlert.warningImmediate, 4.),
|
AudibleAlert.warningImmediate, 4.),
|
||||||
@ -229,7 +229,7 @@ class NormalPermanentAlert(Alert):
|
|||||||
|
|
||||||
|
|
||||||
class StartupAlert(Alert):
|
class StartupAlert(Alert):
|
||||||
def __init__(self, alert_text_1: str, alert_text_2: str = "Always keep hands on wheel and eyes on road", alert_status=AlertStatus.normal):
|
def __init__(self, alert_text_1: str, alert_text_2: str = "驾驶时请双手握住方向盘并眼睛目视前方", alert_status=AlertStatus.normal):
|
||||||
super().__init__(alert_text_1, alert_text_2,
|
super().__init__(alert_text_1, alert_text_2,
|
||||||
alert_status, AlertSize.mid,
|
alert_status, AlertSize.mid,
|
||||||
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 5.),
|
Priority.LOWER, VisualAlert.none, AudibleAlert.none, 5.),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user