simple state machine in card (doesn't work as is)

pull/32380/head
Shane Smiskol 12 months ago
parent 0e9e442d1a
commit b4af8a9b0a
  1. 2
      cereal
  2. 23
      selfdrive/car/card.py
  3. 9
      selfdrive/controls/controlsd.py

@ -1 +1 @@
Subproject commit 0cebb30e41c436b023910a7a03a22e601648cb58 Subproject commit 4d2ead17cf67e23831bd73f8fb036c06846c23f7

@ -15,7 +15,7 @@ from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.boardd.boardd import can_list_to_can_capnp from openpilot.selfdrive.boardd.boardd import can_list_to_can_capnp
from openpilot.selfdrive.car.car_helpers import get_car, get_one_can from openpilot.selfdrive.car.car_helpers import get_car, get_one_can
from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.interfaces import CarInterfaceBase
from openpilot.selfdrive.controls.lib.events import Events from openpilot.selfdrive.controls.lib.events import Events, ET
REPLAY = "REPLAY" in os.environ REPLAY = "REPLAY" in os.environ
@ -88,6 +88,8 @@ class Car:
self.events = Events() self.events = Events()
self.enabled_requested = False
# card is driven by can recv, expected at 100Hz # card is driven by can recv, expected at 100Hz
self.rk = Ratekeeper(100, print_delay_threshold=None) self.rk = Ratekeeper(100, print_delay_threshold=None)
@ -136,13 +138,20 @@ class Car:
CS.events = self.events.to_msg() CS.events = self.events.to_msg()
def state_transition(self, CS: car.CarState): def state_transition(self, CS: car.CarState):
self.v_cruise_helper.update_v_cruise(CS, self.sm['controlsState'].enabled, self.is_metric) # card maintains its own requested state to ensure controlsd doesn't miss any enable/disable events
if self.events.contains(ET.ENABLE):
if not self.events.contains(ET.NO_ENTRY):
self.enabled_requested = True
controlsState = self.sm['controlsState'] else:
if self.controlsState_prev.state == State.disabled: if self.events.contains(ET.USER_DISABLE) or self.events.contains(ET.IMMEDIATE_DISABLE):
# TODO: use ENABLED_STATES from controlsd? it includes softDisabling which isn't possible here self.enabled_requested = False
if controlsState.state in (State.preEnabled, State.overriding, State.enabled):
self.v_cruise_helper.initialize_v_cruise(CS, controlsState.experimentalMode) # sync state with controlsd on non-car disable events
if not self.sm['controlsState'].enabled and self.controlsState_prev.enabled:
self.enabled_requested = False
CS.enabledRequested = self.enabled_requested
def state_publish(self, CS: car.CarState): def state_publish(self, CS: car.CarState):
"""carState and carParams publish loop""" """carState and carParams publish loop"""

@ -147,6 +147,7 @@ class Controls:
self.personality = self.read_personality_param() self.personality = self.read_personality_param()
self.v_cruise_helper = VCruiseHelper(self.CP) self.v_cruise_helper = VCruiseHelper(self.CP)
self.recalibrating_seen = False self.recalibrating_seen = False
self.CS_prev = car.CarState.new_message()
self.can_log_mono_time = 0 self.can_log_mono_time = 0
@ -212,6 +213,12 @@ class Controls:
if CS.canValid: if CS.canValid:
self.events.add_from_msg(CS.events) self.events.add_from_msg(CS.events)
# FIXME: immediate disable from card won't show up as alerts anymore because user disable has higher priority :/
if CS.enabledRequested and not self.CS_prev.enabledRequested:
self.events.add(EventName.pcmEnable)
elif not CS.enabledRequested and self.CS_prev.enabledRequested:
self.events.add(EventName.pcmDisable)
# Create events for temperature, disk space, and memory # Create events for temperature, disk space, and memory
if self.sm['deviceState'].thermalStatus >= ThermalStatus.red: if self.sm['deviceState'].thermalStatus >= ThermalStatus.red:
self.events.add(EventName.overheat) self.events.add(EventName.overheat)
@ -811,6 +818,8 @@ class Controls:
self.publish_logs(CS, start_time, CC, lac_log) self.publish_logs(CS, start_time, CC, lac_log)
cloudlog.timestamp("Logs published") cloudlog.timestamp("Logs published")
self.CS_prev = CS
def read_personality_param(self): def read_personality_param(self):
try: try:
return int(self.params.get('LongitudinalPersonality')) return int(self.params.get('LongitudinalPersonality'))

Loading…
Cancel
Save