@ -2,7 +2,7 @@ from collections import deque
from cereal import car
import cereal . messaging as messaging
from opendbc . car import DT_CTRL , structs
from opendbc . car . interfaces import MAX_CTRL_SPEED , CarStateBase
from opendbc . car . interfaces import MAX_CTRL_SPEED
from opendbc . car . volkswagen . values import CarControllerParams as VWCarControllerParams
from opendbc . car . hyundai . interface import ENABLE_BUTTONS as HYUNDAI_ENABLE_BUTTONS
from opendbc . car . hyundai . carstate import PREV_BUTTON_SAMPLES as HYUNDAI_PREV_BUTTON_SAMPLES
@ -41,102 +41,102 @@ class CarSpecificEvents:
self . cruise_buttons : deque = deque ( [ ] , maxlen = HYUNDAI_PREV_BUTTON_SAMPLES )
def update ( self , CS : CarStateBas e , CS_prev : car . CarState , CC_prev : car . CarControl ) :
def update ( self , CS : car . CarState , CS_prev : car . CarState , CC : car . CarControl ) :
if self . CP . carName in ( ' body ' , ' mock ' ) :
events = Events ( )
elif self . CP . carName in ( ' subaru ' , ' mazda ' ) :
events = self . create_common_events ( CS . out , CS_prev )
events = self . create_common_events ( CS , CS_prev )
elif self . CP . carName == ' ford ' :
events = self . create_common_events ( CS . out , CS_prev , extra_gears = [ GearShifter . manumatic ] )
events = self . create_common_events ( CS , CS_prev , extra_gears = [ GearShifter . manumatic ] )
elif self . CP . carName == ' nissan ' :
events = self . create_common_events ( CS . out , CS_prev , extra_gears = [ GearShifter . brake ] )
events = self . create_common_events ( CS , CS_prev , extra_gears = [ GearShifter . brake ] )
elif self . CP . carName == ' chrysler ' :
events = self . create_common_events ( CS . out , CS_prev , extra_gears = [ GearShifter . low ] )
events = self . create_common_events ( CS , CS_prev , extra_gears = [ GearShifter . low ] )
# Low speed steer alert hysteresis logic
if self . CP . minSteerSpeed > 0. and CS . out . vEgo < ( self . CP . minSteerSpeed + 0.5 ) :
if self . CP . minSteerSpeed > 0. and CS . vEgo < ( self . CP . minSteerSpeed + 0.5 ) :
self . low_speed_alert = True
elif CS . out . vEgo > ( self . CP . minSteerSpeed + 1. ) :
elif CS . vEgo > ( self . CP . minSteerSpeed + 1. ) :
self . low_speed_alert = False
if self . low_speed_alert :
events . add ( EventName . belowSteerSpeed )
elif self . CP . carName == ' honda ' :
events = self . create_common_events ( CS . out , CS_prev , pcm_enable = False )
events = self . create_common_events ( CS , CS_prev , pcm_enable = False )
if self . CP . pcmCruise and CS . out . vEgo < self . CP . minEnableSpeed :
if self . CP . pcmCruise and CS . vEgo < self . CP . minEnableSpeed :
events . add ( EventName . belowEngageSpeed )
if self . CP . pcmCruise :
# we engage when pcm is active (rising edge)
if CS . out . cruiseState . enabled and not CS_prev . cruiseState . enabled :
if CS . cruiseState . enabled and not CS_prev . cruiseState . enabled :
events . add ( EventName . pcmEnable )
elif not CS . out . cruiseState . enabled and ( CC_prev . actuators . accel > = 0. or not self . CP . openpilotLongitudinalControl ) :
elif not CS . cruiseState . enabled and ( CC . actuators . accel > = 0. or not self . CP . openpilotLongitudinalControl ) :
# it can happen that car cruise disables while comma system is enabled: need to
# keep braking if needed or if the speed is very low
if CS . out . vEgo < self . CP . minEnableSpeed + 2. :
if CS . vEgo < self . CP . minEnableSpeed + 2. :
# non loud alert if cruise disables below 25mph as expected (+ a little margin)
events . add ( EventName . speedTooLow )
else :
events . add ( EventName . cruiseDisabled )
if self . CP . minEnableSpeed > 0 and CS . out . vEgo < 0.001 :
if self . CP . minEnableSpeed > 0 and CS . vEgo < 0.001 :
events . add ( EventName . manualRestart )
elif self . CP . carName == ' toyota ' :
events = self . create_common_events ( CS . out , CS_prev )
events = self . create_common_events ( CS , CS_prev )
if self . CP . openpilotLongitudinalControl :
if CS . out . cruiseState . standstill and not CS . out . brakePressed :
if CS . cruiseState . standstill and not CS . brakePressed :
events . add ( EventName . resumeRequired )
if CS . out . vEgo < self . CP . minEnableSpeed :
if CS . vEgo < self . CP . minEnableSpeed :
events . add ( EventName . belowEngageSpeed )
if CC_prev . actuators . accel > 0.3 :
if CC . actuators . accel > 0.3 :
# some margin on the actuator to not false trigger cancellation while stopping
events . add ( EventName . speedTooLow )
if CS . out . vEgo < 0.001 :
if CS . vEgo < 0.001 :
# while in standstill, send a user alert
events . add ( EventName . manualRestart )
elif self . CP . carName == ' gm ' :
# The ECM allows enabling on falling edge of set, but only rising edge of resume
events = self . create_common_events ( CS . out , CS_prev , extra_gears = [ GearShifter . sport , GearShifter . low ,
GearShifter . eco , GearShifter . manumatic ] ,
events = self . create_common_events ( CS , CS_prev , extra_gears = [ GearShifter . sport , GearShifter . low ,
GearShifter . eco , GearShifter . manumatic ] ,
pcm_enable = self . CP . pcmCruise , enable_buttons = ( ButtonType . decelCruise , ) )
if not self . CP . pcmCruise :
if any ( b . type == ButtonType . accelCruise and b . pressed for b in CS . out . buttonEvents ) :
if any ( b . type == ButtonType . accelCruise and b . pressed for b in CS . buttonEvents ) :
events . add ( EventName . buttonEnable )
# Enabling at a standstill with brake is allowed
# TODO: verify 17 Volt can enable for the first time at a stop and allow for all GMs
if CS . out . vEgo < self . CP . minEnableSpeed and not ( CS . out . standstill and CS . out . brake > = 20 and
self . CP . networkLocation == NetworkLocation . fwdCamera ) :
if CS . vEgo < self . CP . minEnableSpeed and not ( CS . standstill and CS . brake > = 20 and
self . CP . networkLocation == NetworkLocation . fwdCamera ) :
events . add ( EventName . belowEngageSpeed )
if CS . out . cruiseState . standstill :
if CS . cruiseState . standstill :
events . add ( EventName . resumeRequired )
if CS . out . vEgo < self . CP . minSteerSpeed :
if CS . vEgo < self . CP . minSteerSpeed :
events . add ( EventName . belowSteerSpeed )
elif self . CP . carName == ' volkswagen ' :
events = self . create_common_events ( CS . out , CS_prev , extra_gears = [ GearShifter . eco , GearShifter . sport , GearShifter . manumatic ] ,
events = self . create_common_events ( CS , CS_prev , extra_gears = [ GearShifter . eco , GearShifter . sport , GearShifter . manumatic ] ,
pcm_enable = not self . CP . openpilotLongitudinalControl ,
enable_buttons = ( ButtonType . setCruise , ButtonType . resumeCruise ) )
# Low speed steer alert hysteresis logic
if ( self . CP . minSteerSpeed - 1e-3 ) > VWCarControllerParams . DEFAULT_MIN_STEER_SPEED and CS . out . vEgo < ( self . CP . minSteerSpeed + 1. ) :
if ( self . CP . minSteerSpeed - 1e-3 ) > VWCarControllerParams . DEFAULT_MIN_STEER_SPEED and CS . vEgo < ( self . CP . minSteerSpeed + 1. ) :
self . low_speed_alert = True
elif CS . out . vEgo > ( self . CP . minSteerSpeed + 2. ) :
elif CS . vEgo > ( self . CP . minSteerSpeed + 2. ) :
self . low_speed_alert = False
if self . low_speed_alert :
events . add ( EventName . belowSteerSpeed )
if self . CP . openpilotLongitudinalControl :
if CS . out . vEgo < self . CP . minEnableSpeed + 0.5 :
if CS . vEgo < self . CP . minEnableSpeed + 0.5 :
events . add ( EventName . belowEngageSpeed )
if CC_prev . enabled and CS . out . vEgo < self . CP . minEnableSpeed :
if CC . enabled and CS . vEgo < self . CP . minEnableSpeed :
events . add ( EventName . speedTooLow )
# TODO: this needs to be implemented generically in carState struct
@ -147,13 +147,13 @@ class CarSpecificEvents:
# On some newer model years, the CANCEL button acts as a pause/resume button based on the PCM state
# To avoid re-engaging when openpilot cancels, check user engagement intention via buttons
# Main button also can trigger an engagement on these cars
self . cruise_buttons . append ( any ( ev . type in HYUNDAI_ENABLE_BUTTONS for ev in CS . out . buttonEvents ) )
events = self . create_common_events ( CS . out , CS_prev , pcm_enable = self . CP . pcmCruise , allow_enable = any ( self . cruise_buttons ) )
self . cruise_buttons . append ( any ( ev . type in HYUNDAI_ENABLE_BUTTONS for ev in CS . buttonEvents ) )
events = self . create_common_events ( CS , CS_prev , pcm_enable = self . CP . pcmCruise , allow_enable = any ( self . cruise_buttons ) )
# low speed steer alert hysteresis logic (only for cars with steer cut off above 10 m/s)
if CS . out . vEgo < ( self . CP . minSteerSpeed + 2. ) and self . CP . minSteerSpeed > 10. :
if CS . vEgo < ( self . CP . minSteerSpeed + 2. ) and self . CP . minSteerSpeed > 10. :
self . low_speed_alert = True
if CS . out . vEgo > ( self . CP . minSteerSpeed + 4. ) :
if CS . vEgo > ( self . CP . minSteerSpeed + 4. ) :
self . low_speed_alert = False
if self . low_speed_alert :
events . add ( EventName . belowSteerSpeed )