@ -18,6 +18,7 @@ AlertStatus = log.Live100Data.AlertStatus
class Alert ( object ) :
def __init__ ( self ,
alert_type ,
alert_text_1 ,
alert_text_2 ,
alert_status ,
@ -30,6 +31,7 @@ class Alert(object):
duration_text ,
alert_rate = 0. ) :
self . alert_type = alert_type
self . alert_text_1 = alert_text_1
self . alert_text_2 = alert_text_2
self . alert_status = alert_status
@ -60,475 +62,554 @@ class Alert(object):
class AlertManager ( object ) :
alerts = {
alert . alert_type : alert
for alert in [
# Miscellaneous alerts
" enable " : Alert (
Alert (
" enable " ,
" " ,
" " ,
AlertStatus . normal , AlertSize . none ,
Priority . MID , None , " beepSingle " , .2 , 0. , 0. ) ,
" disable " : Alert (
Alert (
" disable " ,
" " ,
" " ,
AlertStatus . normal , AlertSize . none ,
Priority . MID , None , " beepSingle " , .2 , 0. , 0. ) ,
" fcw " : Alert (
Alert (
" fcw " ,
" BRAKE! " ,
" Risk of Collision " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " fcw " , " chimeRepeated " , 1. , 2. , 2. ) ,
" steerSaturated " : Alert (
Alert (
" steerSaturated " ,
" TAKE CONTROL " ,
" Turn Exceeds Steering Limit " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . LOW , " steerRequired " , " chimeSingle " , 1. , 2. , 3. ) ,
" steerTempUnavailable " : Alert (
Alert (
" steerTempUnavailable " ,
" TAKE CONTROL " ,
" Steering Temporarily Unavailable " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . LOW , " steerRequired " , " chimeDouble " , .4 , 2. , 3. ) ,
" steerTempUnavailableMute " : Alert (
Alert (
" steerTempUnavailableMute " ,
" TAKE CONTROL " ,
" Steering Temporarily Unavailable " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . LOW , None , None , .2 , .2 , .2 ) ,
" preDriverDistracted " : Alert (
Alert (
" preDriverDistracted " ,
" KEEP EYES ON ROAD: User Appears Distracted " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , " steerRequired " , None , 0. , .1 , .1 , alert_rate = 0.75 ) ,
" promptDriverDistracted " : Alert (
Alert (
" promptDriverDistracted " ,
" KEEP EYES ON ROAD " ,
" User Appears Distracted " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . MID , " steerRequired " , " chimeRepeated " , .1 , .1 , .1 ) ,
" driverDistracted " : Alert (
Alert (
" driverDistracted " ,
" DISENGAGE IMMEDIATELY " ,
" User Was Distracted " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGH , " steerRequired " , " chimeRepeated " , .1 , .1 , .1 ) ,
" preDriverUnresponsive " : Alert (
Alert (
" preDriverUnresponsive " ,
" TOUCH STEERING WHEEL: No Driver Monitoring " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW , " steerRequired " , None , 0. , .1 , .1 , alert_rate = 0.75 ) ,
" promptDriverUnresponsive " : Alert (
Alert (
" promptDriverUnresponsive " ,
" TOUCH STEERING WHEEL " ,
" User Is Unresponsive " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . MID , " steerRequired " , " chimeRepeated " , .1 , .1 , .1 ) ,
" driverUnresponsive " : Alert (
Alert (
" driverUnresponsive " ,
" DISENGAGE IMMEDIATELY " ,
" User Was Unresponsive " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGH , " steerRequired " , " chimeRepeated " , .1 , .1 , .1 ) ,
" driverMonitorOff " : Alert (
Alert (
" driverMonitorOff " ,
" DRIVER MONITOR IS UNAVAILABLE " ,
" Accuracy Is Low " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , None , .4 , 0. , 4. ) ,
" driverMonitorOn " : Alert (
Alert (
" driverMonitorOn " ,
" DRIVER MONITOR IS AVAILABLE " ,
" Accuracy Is High " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , None , .4 , 0. , 4. ) ,
" geofence " : Alert (
Alert (
" geofence " ,
" DISENGAGEMENT REQUIRED " ,
" Not in Geofenced Area " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . HIGH , " steerRequired " , " chimeRepeated " , .1 , .1 , .1 ) ,
" startup " : Alert (
Alert (
" startup " ,
" Be ready to take over at any time " ,
" Always keep hands on wheel and eyes on road " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW_LOWEST , None , None , 0. , 0. , 15. ) ,
" ethicalDilemma " : Alert (
Alert (
" ethicalDilemma " ,
" TAKE CONTROL IMMEDIATELY " ,
" Ethical Dilemma Detected " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
" steerTempUnavailableNoEntry " : Alert (
Alert (
" steerTempUnavailableNoEntry " ,
" openpilot Unavailable " ,
" Steering Temporarily Unavailable " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 0. , 3. ) ,
" manualRestart " : Alert (
Alert (
" manualRestart " ,
" TAKE CONTROL " ,
" Resume Driving Manually " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . LOW , None , None , 0. , 0. , .2 ) ,
" resumeRequired " : Alert (
Alert (
" resumeRequired " ,
" STOPPED " ,
" Press Resume to Move " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . LOW , None , None , 0. , 0. , .2 ) ,
" belowSteerSpeed " : Alert (
Alert (
" belowSteerSpeed " ,
" TAKE CONTROL " ,
" Steer Unavailable Below " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . MID , " steerRequired " , None , 0. , 0. , .1 ) ,
" debugAlert " : Alert (
Alert (
" debugAlert " ,
" DEBUG ALERT " ,
" " ,
AlertStatus . userPrompt , AlertSize . mid ,
Priority . LOW , None , None , .1 , .1 , .1 ) ,
# Non-entry only alerts
" wrongCarModeNoEntry " : Alert (
Alert (
" wrongCarModeNoEntry " ,
" openpilot Unavailable " ,
" Main Switch Off " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 0. , 3. ) ,
" dataNeededNoEntry " : Alert (
Alert (
" dataNeededNoEntry " ,
" openpilot Unavailable " ,
" Data Needed for Calibration. Upload Drive, Try Again " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 0. , 3. ) ,
" outOfSpaceNoEntry " : Alert (
Alert (
" outOfSpaceNoEntry " ,
" openpilot Unavailable " ,
" Out of Storage Space " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 0. , 3. ) ,
" pedalPressedNoEntry " : Alert (
Alert (
" pedalPressedNoEntry " ,
" openpilot Unavailable " ,
" Pedal Pressed During Attempt " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , " brakePressed " , " chimeDouble " , .4 , 2. , 3. ) ,
" speedTooLowNoEntry " : Alert (
Alert (
" speedTooLowNoEntry " ,
" openpilot Unavailable " ,
" Speed Too Low " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" brakeHoldNoEntry " : Alert (
Alert (
" brakeHoldNoEntry " ,
" openpilot Unavailable " ,
" Brake Hold Active " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" parkBrakeNoEntry " : Alert (
Alert (
" parkBrakeNoEntry " ,
" openpilot Unavailable " ,
" Park Brake Engaged " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" lowSpeedLockoutNoEntry " : Alert (
Alert (
" lowSpeedLockoutNoEntry " ,
" openpilot Unavailable " ,
" Cruise Fault: Restart the Car " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" lowBatteryNoEntry " : Alert (
Alert (
" lowBatteryNoEntry " ,
" openpilot Unavailable " ,
" Low Battery " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
# Cancellation alerts causing soft disabling
" overheat " : Alert (
Alert (
" overheat " ,
" TAKE CONTROL IMMEDIATELY " ,
" System Overheated " ,
AlertStatus . critical , AlertSize . full ,
Priority . MID , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
" wrongGear " : Alert (
Alert (
" wrongGear " ,
" TAKE CONTROL IMMEDIATELY " ,
" Gear not D " ,
AlertStatus . critical , AlertSize . full ,
Priority . MID , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
" calibrationInvalid " : Alert (
Alert (
" calibrationInvalid " ,
" TAKE CONTROL IMMEDIATELY " ,
" Calibration Invalid: Reposition EON and Recalibrate " ,
AlertStatus . critical , AlertSize . full ,
Priority . MID , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
" calibrationIncomplete " : Alert (
Alert (
" calibrationIncomplete " ,
" TAKE CONTROL IMMEDIATELY " ,
" Calibration in Progress " ,
AlertStatus . critical , AlertSize . full ,
Priority . MID , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
" doorOpen " : Alert (
Alert (
" doorOpen " ,
" TAKE CONTROL IMMEDIATELY " ,
" Door Open " ,
AlertStatus . critical , AlertSize . full ,
Priority . MID , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
" seatbeltNotLatched " : Alert (
Alert (
" seatbeltNotLatched " ,
" TAKE CONTROL IMMEDIATELY " ,
" Seatbelt Unlatched " ,
AlertStatus . critical , AlertSize . full ,
Priority . MID , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
" espDisabled " : Alert (
Alert (
" espDisabled " ,
" TAKE CONTROL IMMEDIATELY " ,
" ESP Off " ,
AlertStatus . critical , AlertSize . full ,
Priority . MID , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
" lowBattery " : Alert (
Alert (
" lowBattery " ,
" TAKE CONTROL IMMEDIATELY " ,
" Low Battery " ,
AlertStatus . critical , AlertSize . full ,
Priority . MID , " steerRequired " , " chimeRepeated " , 1. , 3. , 3. ) ,
# Cancellation alerts causing immediate disabling
" radarCommIssue " : Alert (
Alert (
" radarCommIssue " ,
" TAKE CONTROL IMMEDIATELY " ,
" Radar Error: Restart the Car " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" radarFault " : Alert (
Alert (
" radarFault " ,
" TAKE CONTROL IMMEDIATELY " ,
" Radar Error: Restart the Car " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" modelCommIssue " : Alert (
Alert (
" modelCommIssue " ,
" TAKE CONTROL IMMEDIATELY " ,
" Model Error: Check Internet Connection " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" controlsFailed " : Alert (
Alert (
" controlsFailed " ,
" TAKE CONTROL IMMEDIATELY " ,
" Controls Failed " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" controlsMismatch " : Alert (
Alert (
" controlsMismatch " ,
" TAKE CONTROL IMMEDIATELY " ,
" Controls Mismatch " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" commIssue " : Alert (
Alert (
" commIssue " ,
" TAKE CONTROL IMMEDIATELY " ,
" CAN Error: Check Connections " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" steerUnavailable " : Alert (
Alert (
" steerUnavailable " ,
" TAKE CONTROL IMMEDIATELY " ,
" LKAS Fault: Restart the Car " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" brakeUnavailable " : Alert (
Alert (
" brakeUnavailable " ,
" TAKE CONTROL IMMEDIATELY " ,
" Cruise Fault: Restart the Car " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" gasUnavailable " : Alert (
Alert (
" gasUnavailable " ,
" TAKE CONTROL IMMEDIATELY " ,
" Gas Fault: Restart the Car " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" reverseGear " : Alert (
Alert (
" reverseGear " ,
" TAKE CONTROL IMMEDIATELY " ,
" Reverse Gear " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" cruiseDisabled " : Alert (
Alert (
" cruiseDisabled " ,
" TAKE CONTROL IMMEDIATELY " ,
" Cruise Is Off " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
" plannerError " : Alert (
Alert (
" plannerError " ,
" TAKE CONTROL IMMEDIATELY " ,
" Planner Solution Error " ,
AlertStatus . critical , AlertSize . full ,
Priority . HIGHEST , " steerRequired " , " chimeRepeated " , 1. , 3. , 4. ) ,
# not loud cancellations (user is in control)
" noTarget " : Alert (
Alert (
" noTarget " ,
" openpilot Canceled " ,
" No close lead car " ,
AlertStatus . normal , AlertSize . mid ,
Priority . HIGH , None , " chimeDouble " , .4 , 2. , 3. ) ,
" speedTooLow " : Alert (
Alert (
" speedTooLow " ,
" openpilot Canceled " ,
" Speed too low " ,
AlertStatus . normal , AlertSize . mid ,
Priority . HIGH , None , " chimeDouble " , .4 , 2. , 3. ) ,
# Cancellation alerts causing non-entry
" overheatNoEntry " : Alert (
Alert (
" overheatNoEntry " ,
" openpilot Unavailable " ,
" System overheated " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" wrongGearNoEntry " : Alert (
Alert (
" wrongGearNoEntry " ,
" openpilot Unavailable " ,
" Gear not D " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" calibrationInvalidNoEntry " : Alert (
Alert (
" calibrationInvalidNoEntry " ,
" openpilot Unavailable " ,
" Calibration Invalid: Reposition EON and Recalibrate " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" calibrationIncompleteNoEntry " : Alert (
Alert (
" calibrationIncompleteNoEntry " ,
" openpilot Unavailable " ,
" Calibration in Progress " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" doorOpenNoEntry " : Alert (
Alert (
" doorOpenNoEntry " ,
" openpilot Unavailable " ,
" Door open " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" seatbeltNotLatchedNoEntry " : Alert (
Alert (
" seatbeltNotLatchedNoEntry " ,
" openpilot Unavailable " ,
" Seatbelt unlatched " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" espDisabledNoEntry " : Alert (
Alert (
" espDisabledNoEntry " ,
" openpilot Unavailable " ,
" ESP Off " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" geofenceNoEntry " : Alert (
Alert (
" geofenceNoEntry " ,
" openpilot Unavailable " ,
" Not in Geofenced Area " ,
AlertStatus . normal , AlertSize . mid ,
Priority . MID , None , " chimeDouble " , .4 , 2. , 3. ) ,
" radarCommIssueNoEntry " : Alert (
Alert (
" radarCommIssueNoEntry " ,
" openpilot Unavailable " ,
" Radar Error: Restart the Car " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" radarFaultNoEntry " : Alert (
Alert (
" radarFaultNoEntry " ,
" openpilot Unavailable " ,
" Radar Error: Restart the Car " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" modelCommIssueNoEntry " : Alert (
Alert (
" modelCommIssueNoEntry " ,
" openpilot Unavailable " ,
" Model Error: Check Internet Connection " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" controlsFailedNoEntry " : Alert (
Alert (
" controlsFailedNoEntry " ,
" openpilot Unavailable " ,
" Controls Failed " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" commIssueNoEntry " : Alert (
Alert (
" commIssueNoEntry " ,
" openpilot Unavailable " ,
" CAN Error: Check Connections " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" steerUnavailableNoEntry " : Alert (
Alert (
" steerUnavailableNoEntry " ,
" openpilot Unavailable " ,
" LKAS Fault: Restart the Car " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" brakeUnavailableNoEntry " : Alert (
Alert (
" brakeUnavailableNoEntry " ,
" openpilot Unavailable " ,
" Cruise Fault: Restart the Car " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" gasUnavailableNoEntry " : Alert (
Alert (
" gasUnavailableNoEntry " ,
" openpilot Unavailable " ,
" Gas Error: Restart the Car " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" reverseGearNoEntry " : Alert (
Alert (
" reverseGearNoEntry " ,
" openpilot Unavailable " ,
" Reverse Gear " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" cruiseDisabledNoEntry " : Alert (
Alert (
" cruiseDisabledNoEntry " ,
" openpilot Unavailable " ,
" Cruise is Off " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" noTargetNoEntry " : Alert (
Alert (
" noTargetNoEntry " ,
" openpilot Unavailable " ,
" No Close Lead Car " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
" plannerErrorNoEntry " : Alert (
Alert (
" plannerErrorNoEntry " ,
" openpilot Unavailable " ,
" Planner Solution Error " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOW , None , " chimeDouble " , .4 , 2. , 3. ) ,
# permanent alerts
" steerUnavailablePermanent " : Alert (
Alert (
" steerUnavailablePermanent " ,
" LKAS Fault: Restart the car to engage " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW_LOWEST , None , None , 0. , 0. , .2 ) ,
" brakeUnavailablePermanent " : Alert (
Alert (
" brakeUnavailablePermanent " ,
" Cruise Fault: Restart the car to engage " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW_LOWEST , None , None , 0. , 0. , .2 ) ,
" lowSpeedLockoutPermanent " : Alert (
Alert (
" lowSpeedLockoutPermanent " ,
" Cruise Fault: Restart the car to engage " ,
" " ,
AlertStatus . normal , AlertSize . small ,
Priority . LOW_LOWEST , None , None , 0. , 0. , .2 ) ,
" calibrationIncompletePermanent " : Alert (
Alert (
" calibrationIncompletePermanent " ,
" Calibration in Progress: " ,
" Drive Above " ,
AlertStatus . normal , AlertSize . mid ,
Priority . LOWEST , None , None , 0. , 0. , .2 ) ,
]
}
def __init__ ( self ) :
@ -565,6 +646,7 @@ class AlertManager(object):
ca = self . activealerts [ 0 ] if self . alertPresent ( ) else None
# start with assuming no alerts
self . alert_type = " "
self . alert_text_1 = " "
self . alert_text_2 = " "
self . alert_status = AlertStatus . normal
@ -581,6 +663,7 @@ class AlertManager(object):
self . visual_alert = ca . visual_alert
if ca . start_time + ca . duration_text > cur_time :
self . alert_type = ca . alert_type
self . alert_text_1 = ca . alert_text_1
self . alert_text_2 = ca . alert_text_2
self . alert_status = ca . alert_status