Subaru: infotainment status intercept and rewrite (#27829)

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* wip

* remove compiler flag stuff

* force error for testing

* bump panda and fix mistake

* wip

* bump panda

* wip

* wip

* forgot checksum and stuff

* add to signals

* rename

* test

* test

* bump panda and opendbc

* bump cereal

* add blank filler

* test

* add steer required to infotainment

* fix missing bit

* fix missing bit

* cleanup for PR

* cleanup for PR

* bump submodules

* wip

* wip

* i wonder what 1 is

* seemed to also be obstacle detected?

* bumppanda

* only if global

* only global gen 2

* fix order

* detect and send

* detect in rest of places

* update refs

* bumpopendbc

* copy whole message (camera sometimes sets these signals)

* bumppanda

* update refs!

* bumppanda

* let's not change this

* same as all the other functions

* Revert "same as all the other functions"

This reverts commit e86dbb695e.

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
pull/27947/head
Justin Newberry 2 years ago committed by GitHub
parent 3cd00a9b6c
commit d59bfa5519
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      panda
  2. 7
      selfdrive/car/subaru/carcontroller.py
  3. 13
      selfdrive/car/subaru/carstate.py
  4. 6
      selfdrive/car/subaru/interface.py
  5. 17
      selfdrive/car/subaru/subarucan.py
  6. 6
      selfdrive/car/subaru/values.py
  7. 2
      selfdrive/test/process_replay/ref_commit

@ -1 +1 @@
Subproject commit 2f7962189329ce5da5d68cb3261982aaa84b0deb Subproject commit 1f8b03666d8f8ed377e9af89cffc5b1bdd70e922

@ -1,7 +1,7 @@
from opendbc.can.packer import CANPacker from opendbc.can.packer import CANPacker
from selfdrive.car import apply_driver_steer_torque_limits from selfdrive.car import apply_driver_steer_torque_limits
from selfdrive.car.subaru import subarucan from selfdrive.car.subaru import subarucan
from selfdrive.car.subaru.values import DBC, GLOBAL_GEN2, PREGLOBAL_CARS, CarControllerParams from selfdrive.car.subaru.values import DBC, GLOBAL_GEN2, PREGLOBAL_CARS, CarControllerParams, SubaruFlags
class CarController: class CarController:
@ -13,6 +13,7 @@ class CarController:
self.es_lkas_cnt = -1 self.es_lkas_cnt = -1
self.es_distance_cnt = -1 self.es_distance_cnt = -1
self.es_dashstatus_cnt = -1 self.es_dashstatus_cnt = -1
self.infotainmentstatus_cnt = -1
self.cruise_button_prev = 0 self.cruise_button_prev = 0
self.last_cancel_frame = 0 self.last_cancel_frame = 0
@ -85,6 +86,10 @@ class CarController:
hud_control.leftLaneDepart, hud_control.rightLaneDepart)) hud_control.leftLaneDepart, hud_control.rightLaneDepart))
self.es_lkas_cnt = CS.es_lkas_msg["COUNTER"] self.es_lkas_cnt = CS.es_lkas_msg["COUNTER"]
if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT and self.infotainmentstatus_cnt != CS.es_infotainmentstatus_msg["COUNTER"]:
can_sends.append(subarucan.create_infotainmentstatus(self.packer, CS.es_infotainmentstatus_msg, hud_control.visualAlert))
self.infotainmentstatus_cnt = CS.es_infotainmentstatus_msg["COUNTER"]
new_actuators = actuators.copy() new_actuators = actuators.copy()
new_actuators.steer = self.apply_steer_last / self.p.STEER_MAX new_actuators.steer = self.apply_steer_last / self.p.STEER_MAX
new_actuators.steerOutputCan = self.apply_steer_last new_actuators.steerOutputCan = self.apply_steer_last

@ -4,7 +4,7 @@ from opendbc.can.can_define import CANDefine
from common.conversions import Conversions as CV from common.conversions import Conversions as CV
from selfdrive.car.interfaces import CarStateBase from selfdrive.car.interfaces import CarStateBase
from opendbc.can.parser import CANParser from opendbc.can.parser import CANParser
from selfdrive.car.subaru.values import DBC, CAR, GLOBAL_GEN2, PREGLOBAL_CARS from selfdrive.car.subaru.values import DBC, CAR, GLOBAL_GEN2, PREGLOBAL_CARS, SubaruFlags
class CarState(CarStateBase): class CarState(CarStateBase):
@ -82,6 +82,8 @@ class CarState(CarStateBase):
cp_es_distance = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp_cam cp_es_distance = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp_cam
self.es_distance_msg = copy.copy(cp_es_distance.vl["ES_Distance"]) self.es_distance_msg = copy.copy(cp_es_distance.vl["ES_Distance"])
self.es_dashstatus_msg = copy.copy(cp_cam.vl["ES_DashStatus"]) self.es_dashstatus_msg = copy.copy(cp_cam.vl["ES_DashStatus"])
if self.CP.flags & SubaruFlags.SEND_INFOTAINMENT:
self.es_infotainmentstatus_msg = copy.copy(cp_cam.vl["INFOTAINMENT_STATUS"])
return ret return ret
@ -301,6 +303,15 @@ class CarState(CarStateBase):
signals += CarState.get_global_es_distance_signals()[0] signals += CarState.get_global_es_distance_signals()[0]
checks += CarState.get_global_es_distance_signals()[1] checks += CarState.get_global_es_distance_signals()[1]
if CP.flags & SubaruFlags.SEND_INFOTAINMENT:
signals += [
("LKAS_State_Infotainment", "INFOTAINMENT_STATUS"),
("LKAS_Blue_Lines", "INFOTAINMENT_STATUS"),
("Signal1", "INFOTAINMENT_STATUS"),
("Signal2", "INFOTAINMENT_STATUS"),
]
checks.append(("INFOTAINMENT_STATUS", 10))
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 2) return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, 2)
@staticmethod @staticmethod

@ -3,7 +3,7 @@ from cereal import car
from panda import Panda from panda import Panda
from selfdrive.car import STD_CARGO_KG, get_safety_config from selfdrive.car import STD_CARGO_KG, get_safety_config
from selfdrive.car.interfaces import CarInterfaceBase from selfdrive.car.interfaces import CarInterfaceBase
from selfdrive.car.subaru.values import CAR, GLOBAL_GEN2, PREGLOBAL_CARS from selfdrive.car.subaru.values import CAR, GLOBAL_GEN2, PREGLOBAL_CARS, SubaruFlags
class CarInterface(CarInterfaceBase): class CarInterface(CarInterfaceBase):
@ -15,6 +15,10 @@ class CarInterface(CarInterfaceBase):
ret.dashcamOnly = candidate in PREGLOBAL_CARS ret.dashcamOnly = candidate in PREGLOBAL_CARS
ret.autoResumeSng = False ret.autoResumeSng = False
# Detect infotainment message sent from the camera
if candidate not in PREGLOBAL_CARS and 0x323 in fingerprint[2]:
ret.flags |= SubaruFlags.SEND_INFOTAINMENT.value
if candidate in PREGLOBAL_CARS: if candidate in PREGLOBAL_CARS:
ret.enableBsm = 0x25c in fingerprint[0] ret.enableBsm = 0x25c in fingerprint[0]
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.subaruLegacy)] ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.subaruLegacy)]

@ -71,11 +71,26 @@ def create_es_dashstatus(packer, dashstatus_msg):
values = copy.copy(dashstatus_msg) values = copy.copy(dashstatus_msg)
# Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts # Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts
if values["LKAS_State_Msg"] in [2, 3]: if values["LKAS_State_Msg"] in (2, 3):
values["LKAS_State_Msg"] = 0 values["LKAS_State_Msg"] = 0
return packer.make_can_msg("ES_DashStatus", 0, values) return packer.make_can_msg("ES_DashStatus", 0, values)
def create_infotainmentstatus(packer, infotainmentstatus_msg, visual_alert):
# Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts
if infotainmentstatus_msg["LKAS_State_Infotainment"] in (3, 4):
infotainmentstatus_msg["LKAS_State_Infotainment"] = 0
# Show Keep hands on wheel alert for openpilot steerRequired alert
if visual_alert == VisualAlert.steerRequired:
infotainmentstatus_msg["LKAS_State_Infotainment"] = 3
# Show Obstacle Detected for fcw
if visual_alert == VisualAlert.fcw:
infotainmentstatus_msg["LKAS_State_Infotainment"] = 2
return packer.make_can_msg("INFOTAINMENT_STATUS", 0, infotainmentstatus_msg)
# *** Subaru Pre-global *** # *** Subaru Pre-global ***
def subaru_preglobal_checksum(packer, values, addr): def subaru_preglobal_checksum(packer, values, addr):

@ -1,5 +1,5 @@
from dataclasses import dataclass from dataclasses import dataclass
from enum import Enum from enum import Enum, IntFlag
from typing import Dict, List, Union from typing import Dict, List, Union
from cereal import car from cereal import car
@ -30,6 +30,10 @@ class CarControllerParams:
self.STEER_MAX = 2047 self.STEER_MAX = 2047
class SubaruFlags(IntFlag):
SEND_INFOTAINMENT = 1
class CAR: class CAR:
# Global platform # Global platform
ASCENT = "SUBARU ASCENT LIMITED 2019" ASCENT = "SUBARU ASCENT LIMITED 2019"

@ -1 +1 @@
1bb3f665191e1b75c1b786f60e76d51b274f98ae 818a0f25985c95bb56e54a4ac3cfb3126e6044e2
Loading…
Cancel
Save