You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
10 KiB
255 lines
10 KiB
from dataclasses import dataclass
|
|
from enum import Enum, IntFlag, StrEnum
|
|
|
|
from cereal import car
|
|
from openpilot.common.conversions import Conversions as CV
|
|
from panda.python import uds
|
|
from openpilot.selfdrive.car import dbc_dict
|
|
from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column
|
|
from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16
|
|
|
|
Ecu = car.CarParams.Ecu
|
|
VisualAlert = car.CarControl.HUDControl.VisualAlert
|
|
|
|
|
|
class CarControllerParams:
|
|
# Allow small margin below -3.5 m/s^2 from ISO 15622:2018 since we
|
|
# perform the closed loop control, and might need some
|
|
# to apply some more braking if we're on a downhill slope.
|
|
# Our controller should still keep the 2 second average above
|
|
# -3.5 m/s^2 as per planner limits
|
|
NIDEC_ACCEL_MIN = -4.0 # m/s^2
|
|
NIDEC_ACCEL_MAX = 1.6 # m/s^2, lower than 2.0 m/s^2 for tuning reasons
|
|
|
|
NIDEC_ACCEL_LOOKUP_BP = [-1., 0., .6]
|
|
NIDEC_ACCEL_LOOKUP_V = [-4.8, 0., 2.0]
|
|
|
|
NIDEC_MAX_ACCEL_V = [0.5, 2.4, 1.4, 0.6]
|
|
NIDEC_MAX_ACCEL_BP = [0.0, 4.0, 10., 20.]
|
|
|
|
NIDEC_GAS_MAX = 198 # 0xc6
|
|
NIDEC_BRAKE_MAX = 1024 // 4
|
|
|
|
BOSCH_ACCEL_MIN = -3.5 # m/s^2
|
|
BOSCH_ACCEL_MAX = 2.0 # m/s^2
|
|
|
|
BOSCH_GAS_LOOKUP_BP = [-0.2, 2.0] # 2m/s^2
|
|
BOSCH_GAS_LOOKUP_V = [0, 1600]
|
|
|
|
def __init__(self, CP):
|
|
self.STEER_MAX = CP.lateralParams.torqueBP[-1]
|
|
# mirror of list (assuming first item is zero) for interp of signed request values
|
|
assert(CP.lateralParams.torqueBP[0] == 0)
|
|
assert(CP.lateralParams.torqueBP[0] == 0)
|
|
self.STEER_LOOKUP_BP = [v * -1 for v in CP.lateralParams.torqueBP][1:][::-1] + list(CP.lateralParams.torqueBP)
|
|
self.STEER_LOOKUP_V = [v * -1 for v in CP.lateralParams.torqueV][1:][::-1] + list(CP.lateralParams.torqueV)
|
|
|
|
|
|
class HondaFlags(IntFlag):
|
|
# Bosch models with alternate set of LKAS_HUD messages
|
|
BOSCH_EXT_HUD = 1
|
|
BOSCH_ALT_BRAKE = 2
|
|
|
|
|
|
# Car button codes
|
|
class CruiseButtons:
|
|
RES_ACCEL = 4
|
|
DECEL_SET = 3
|
|
CANCEL = 2
|
|
MAIN = 1
|
|
|
|
|
|
# See dbc files for info on values
|
|
VISUAL_HUD = {
|
|
VisualAlert.none: 0,
|
|
VisualAlert.fcw: 1,
|
|
VisualAlert.steerRequired: 1,
|
|
VisualAlert.ldw: 1,
|
|
VisualAlert.brakePressed: 10,
|
|
VisualAlert.wrongGear: 6,
|
|
VisualAlert.seatbeltUnbuckled: 5,
|
|
VisualAlert.speedTooHigh: 8
|
|
}
|
|
|
|
|
|
class CAR(StrEnum):
|
|
ACCORD = "HONDA ACCORD 2018"
|
|
ACCORDH = "HONDA ACCORD HYBRID 2018"
|
|
CIVIC = "HONDA CIVIC 2016"
|
|
CIVIC_BOSCH = "HONDA CIVIC (BOSCH) 2019"
|
|
CIVIC_BOSCH_DIESEL = "HONDA CIVIC SEDAN 1.6 DIESEL 2019"
|
|
CIVIC_2022 = "HONDA CIVIC 2022"
|
|
ACURA_ILX = "ACURA ILX 2016"
|
|
CRV = "HONDA CR-V 2016"
|
|
CRV_5G = "HONDA CR-V 2017"
|
|
CRV_EU = "HONDA CR-V EU 2016"
|
|
CRV_HYBRID = "HONDA CR-V HYBRID 2019"
|
|
FIT = "HONDA FIT 2018"
|
|
FREED = "HONDA FREED 2020"
|
|
HRV = "HONDA HRV 2019"
|
|
HRV_3G = "HONDA HR-V 2023"
|
|
ODYSSEY = "HONDA ODYSSEY 2018"
|
|
ODYSSEY_CHN = "HONDA ODYSSEY CHN 2019"
|
|
ACURA_RDX = "ACURA RDX 2018"
|
|
ACURA_RDX_3G = "ACURA RDX 2020"
|
|
PILOT = "HONDA PILOT 2017"
|
|
RIDGELINE = "HONDA RIDGELINE 2017"
|
|
INSIGHT = "HONDA INSIGHT 2019"
|
|
HONDA_E = "HONDA E 2020"
|
|
|
|
|
|
class Footnote(Enum):
|
|
CIVIC_DIESEL = CarFootnote(
|
|
"2019 Honda Civic 1.6L Diesel Sedan does not have ALC below 12mph.",
|
|
Column.FSR_STEERING)
|
|
|
|
|
|
@dataclass
|
|
class HondaCarInfo(CarInfo):
|
|
package: str = "Honda Sensing"
|
|
|
|
def init_make(self, CP: car.CarParams):
|
|
if CP.carFingerprint in HONDA_BOSCH:
|
|
self.car_parts = CarParts.common([CarHarness.bosch_b]) if CP.carFingerprint in HONDA_BOSCH_RADARLESS else CarParts.common([CarHarness.bosch_a])
|
|
else:
|
|
self.car_parts = CarParts.common([CarHarness.nidec])
|
|
|
|
|
|
CAR_INFO: dict[str, HondaCarInfo | list[HondaCarInfo] | None] = {
|
|
CAR.ACCORD: [
|
|
HondaCarInfo("Honda Accord 2018-22", "All", video_link="https://www.youtube.com/watch?v=mrUwlj3Mi58", min_steer_speed=3. * CV.MPH_TO_MS),
|
|
HondaCarInfo("Honda Inspire 2018", "All", min_steer_speed=3. * CV.MPH_TO_MS),
|
|
],
|
|
CAR.ACCORDH: HondaCarInfo("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS),
|
|
CAR.CIVIC: HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE"),
|
|
CAR.CIVIC_BOSCH: [
|
|
HondaCarInfo("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8",
|
|
footnotes=[Footnote.CIVIC_DIESEL], min_steer_speed=2. * CV.MPH_TO_MS),
|
|
HondaCarInfo("Honda Civic Hatchback 2017-21", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
],
|
|
CAR.CIVIC_BOSCH_DIESEL: None, # same platform
|
|
CAR.CIVIC_2022: [
|
|
HondaCarInfo("Honda Civic 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"),
|
|
HondaCarInfo("Honda Civic Hatchback 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"),
|
|
],
|
|
CAR.ACURA_ILX: HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS),
|
|
CAR.CRV: HondaCarInfo("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
CAR.CRV_5G: HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
CAR.CRV_EU: None, # HondaCarInfo("Honda CR-V EU", "Touring"), # Euro version of CRV Touring
|
|
CAR.CRV_HYBRID: HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
CAR.FIT: HondaCarInfo("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
CAR.FREED: HondaCarInfo("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
CAR.HRV: HondaCarInfo("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
CAR.HRV_3G: HondaCarInfo("Honda HR-V 2023", "All"),
|
|
CAR.ODYSSEY: HondaCarInfo("Honda Odyssey 2018-20"),
|
|
CAR.ODYSSEY_CHN: None, # Chinese version of Odyssey
|
|
CAR.ACURA_RDX: HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
CAR.ACURA_RDX_3G: HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS),
|
|
CAR.PILOT: [
|
|
HondaCarInfo("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
HondaCarInfo("Honda Passport 2019-23", "All", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
],
|
|
CAR.RIDGELINE: HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS),
|
|
CAR.INSIGHT: HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS),
|
|
CAR.HONDA_E: HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS),
|
|
}
|
|
|
|
HONDA_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
|
|
p16(0xF112)
|
|
HONDA_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
|
|
p16(0xF112)
|
|
|
|
FW_QUERY_CONFIG = FwQueryConfig(
|
|
requests=[
|
|
# Currently used to fingerprint
|
|
Request(
|
|
[StdQueries.UDS_VERSION_REQUEST],
|
|
[StdQueries.UDS_VERSION_RESPONSE],
|
|
bus=1,
|
|
),
|
|
|
|
# Data collection requests:
|
|
# Attempt to get the radarless Civic 2022+ camera FW
|
|
Request(
|
|
[StdQueries.TESTER_PRESENT_REQUEST, StdQueries.UDS_VERSION_REQUEST],
|
|
[StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.UDS_VERSION_RESPONSE],
|
|
bus=0,
|
|
logging=True
|
|
),
|
|
# Log extra identifiers for current ECUs
|
|
Request(
|
|
[HONDA_VERSION_REQUEST],
|
|
[HONDA_VERSION_RESPONSE],
|
|
bus=1,
|
|
logging=True,
|
|
),
|
|
# Nidec PT bus
|
|
Request(
|
|
[StdQueries.UDS_VERSION_REQUEST],
|
|
[StdQueries.UDS_VERSION_RESPONSE],
|
|
bus=0,
|
|
logging=True,
|
|
),
|
|
# Bosch PT bus
|
|
Request(
|
|
[StdQueries.UDS_VERSION_REQUEST],
|
|
[StdQueries.UDS_VERSION_RESPONSE],
|
|
bus=1,
|
|
obd_multiplexing=False,
|
|
),
|
|
],
|
|
# We lose these ECUs without the comma power on these cars.
|
|
# Note that we still attempt to match with them when they are present
|
|
non_essential_ecus={
|
|
Ecu.programmedFuelInjection: [CAR.CIVIC_BOSCH, CAR.CRV_5G],
|
|
Ecu.transmission: [CAR.CIVIC_BOSCH, CAR.CRV_5G],
|
|
Ecu.vsa: [CAR.CIVIC_BOSCH, CAR.CRV_5G],
|
|
Ecu.combinationMeter: [CAR.CIVIC_BOSCH, CAR.CRV_5G],
|
|
Ecu.gateway: [CAR.CIVIC_BOSCH, CAR.CRV_5G],
|
|
Ecu.electricBrakeBooster: [CAR.CIVIC_BOSCH, CAR.CRV_5G],
|
|
},
|
|
extra_ecus=[
|
|
# The only other ECU on PT bus accessible by camera on radarless Civic
|
|
(Ecu.unknown, 0x18DAB3F1, None),
|
|
],
|
|
)
|
|
|
|
|
|
DBC = {
|
|
CAR.ACCORD: dbc_dict('honda_accord_2018_can_generated', None),
|
|
CAR.ACCORDH: dbc_dict('honda_accord_2018_can_generated', None),
|
|
CAR.ACURA_ILX: dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.ACURA_RDX: dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.ACURA_RDX_3G: dbc_dict('acura_rdx_2020_can_generated', None),
|
|
CAR.CIVIC: dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.CIVIC_BOSCH: dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None),
|
|
CAR.CIVIC_BOSCH_DIESEL: dbc_dict('honda_accord_2018_can_generated', None),
|
|
CAR.CRV: dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.CRV_5G: dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'),
|
|
CAR.CRV_EU: dbc_dict('honda_crv_executive_2016_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.CRV_HYBRID: dbc_dict('honda_accord_2018_can_generated', None),
|
|
CAR.FIT: dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.FREED: dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.HRV: dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.HRV_3G: dbc_dict('honda_civic_ex_2022_can_generated', None),
|
|
CAR.ODYSSEY: dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.ODYSSEY_CHN: dbc_dict('honda_odyssey_extreme_edition_2018_china_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.PILOT: dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.RIDGELINE: dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'),
|
|
CAR.INSIGHT: dbc_dict('honda_insight_ex_2019_can_generated', None),
|
|
CAR.HONDA_E: dbc_dict('acura_rdx_2020_can_generated', None),
|
|
CAR.CIVIC_2022: dbc_dict('honda_civic_ex_2022_can_generated', None),
|
|
}
|
|
|
|
STEER_THRESHOLD = {
|
|
# default is 1200, overrides go here
|
|
CAR.ACURA_RDX: 400,
|
|
CAR.CRV_EU: 400,
|
|
}
|
|
|
|
HONDA_NIDEC_ALT_PCM_ACCEL = {CAR.ODYSSEY}
|
|
HONDA_NIDEC_ALT_SCM_MESSAGES = {CAR.ACURA_ILX, CAR.ACURA_RDX, CAR.CRV, CAR.CRV_EU, CAR.FIT, CAR.FREED, CAR.HRV, CAR.ODYSSEY_CHN,
|
|
CAR.PILOT, CAR.RIDGELINE}
|
|
HONDA_BOSCH = {CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_5G,
|
|
CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_2022, CAR.HRV_3G}
|
|
HONDA_BOSCH_RADARLESS = {CAR.CIVIC_2022, CAR.HRV_3G}
|
|
|