Skip to content

Commit 4ffe9e6

Browse files
JMPZ11sshaneadeebshihadeh
authored
GM: Bolt EUV 2022-23 port (#24875)
* Switch to ECMPRDNL2 for GM gear * Removing manumatic gear # * values.py almost complete * Silverado and Bolt EUV val and CP * GM controller updated * Cam hrns supp done (in theory) * cleanup for new cars * Remove extra constant * WS, etc cleanup * removing the unused * Fix kpBP typo * Updated docs * Skip's PIF tune * Dropped LKA CAN error patch * Add silverado sigmoid ff * CAN Err & LKA latch patch * Remove EPS fault fix (another PR) * Remove Silverado (another PR) * clean up some common params * Remove Escalade FP Remove Escalade FP * comment * Premier is just a trim Premier is just a trim Premier is just a trim * no footnote: new Bolt is like most other cars, older GM were outliers not at the camera * clean up clean up * bump panda * bump panda * bump panda * bump panda * bump panda * remove comments * try spamming buttons on bus 2 * bump panda * bumping opendbc w btn rc * not needed for this port This reverts commit 6af1f0b. * add button safety * Send next rc when spamming btns * forward other signals in message * missing DriveModeButton * fill cruiseState.speed * see if resume works without counter * try the whole message * send immediately and at 10Hz * no resume, back to just button signal * even holding random buttons it cancels * Use torque controller with base tune * stock long GM don't auto-resume yet * Testing GM zero min steer speed * Revert latcontrol * revert opendbc * latActive is basically lkas_enabled * Update Bolt torque params * comment * clean up * Add to releases * Add test route * Don't specify segment * bump panda * bump panda * no harness for Bolt just yet * Apply suggestions from code review Co-authored-by: Adeeb Shihadeh <[email protected]> * We support all and 2023 * move safetyParam up to first cam check * Bump panda and update docs * Update RELEASES.md Co-authored-by: Adeeb Shihadeh <[email protected]> Co-authored-by: Shane Smiskol <[email protected]> Co-authored-by: Adeeb Shihadeh <[email protected]>
1 parent e4340e0 commit 4ffe9e6

File tree

12 files changed

+90
-29
lines changed

12 files changed

+90
-29
lines changed

RELEASES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
Version 0.8.16 (2022-XX-XX)
22
========================
3+
* Chevrolet Bolt EUV 2022-23 support thanks to JasonJShuler!
34
* Hyundai Ioniq 5 2022 support thanks to sunnyhaibin!
45
* Hyundai Kona Electric 2022 support thanks to sunnyhaibin!
56
* Subaru Outback 2020-22 support

docs/CARS.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ A supported vehicle is one that just works when you install a comma device. Ever
1919
- [![star](assets/icon-star-empty.svg)](##) - Limited ability to make tighter turns.
2020

2121

22-
# 200 Supported Cars
22+
# 201 Supported Cars
2323

2424
|Make|Model|Supported Package|openpilot ACC|Stop and Go|Steer to 0|Steering Torque|
2525
|---|---|---|:---:|:---:|:---:|:---:|
@@ -33,6 +33,7 @@ A supported vehicle is one that just works when you install a comma device. Ever
3333
|Audi|RS3 2018|ACC + Lane Assist|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
3434
|Audi|S3 2015-17|ACC + Lane Assist|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
3535
|Cadillac|Escalade ESV 2016[<sup>1</sup>](#footnotes)|Adaptive Cruise Control (ACC) & LKAS|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
36+
|Chevrolet|Bolt EUV 2022-23|All|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
3637
|Chevrolet|Volt 2017-18[<sup>1</sup>](#footnotes)|Adaptive Cruise Control|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
3738
|Chrysler|Pacifica 2017-18|Adaptive Cruise Control|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
3839
|Chrysler|Pacifica 2019-20|Adaptive Cruise Control|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|

selfdrive/car/docs_definitions.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
GOOD_TORQUE_THRESHOLD = 1.0 # m/s^2
1111
MODEL_YEARS_RE = r"(?<= )((\d{4}-\d{2})|(\d{4}))(,|$)"
1212

13+
# Makes that lack auto-resume with stock long, and auto resume in any configuration
14+
NO_AUTO_RESUME_STOCK_LONG = {"toyota", "gm"}
15+
NO_AUTO_RESUME = NO_AUTO_RESUME_STOCK_LONG | {"nissan", "subaru"}
16+
1317

1418
class Tier(Enum):
1519
GOLD = 0
@@ -147,11 +151,11 @@ def get_detail_sentence(self, CP):
147151
else:
148152
alc = ""
149153

150-
# Exception for Nissan, Subaru, and stock long Toyota which do not auto-resume yet
154+
# Exception for cars which do not auto-resume yet
151155
acc = ""
152156
if self.min_enable_speed > 0:
153157
acc = f" <strong>while driving above {self.min_enable_speed * CV.MS_TO_MPH:.0f} mph</strong>"
154-
elif CP.carName not in ("nissan", "subaru", "toyota") or (CP.carName == "toyota" and CP.openpilotLongitudinalControl):
158+
elif CP.carName not in NO_AUTO_RESUME or (CP.carName in NO_AUTO_RESUME_STOCK_LONG and CP.openpilotLongitudinalControl):
155159
acc = " <strong>that automatically resumes from a stop</strong>"
156160

157161
if self.row[Column.STEERING_TORQUE] != Star.FULL:
@@ -210,6 +214,7 @@ class Harness(Enum):
210214
hyundai_p = "Hyundai P"
211215
custom = "Developer"
212216
obd_ii = "OBD-II"
217+
gm = "GM"
213218
nissan_a = "Nissan A"
214219
nissan_b = "Nissan B"
215220
mazda = "Mazda"

selfdrive/car/gm/carcontroller.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from opendbc.can.packer import CANPacker
66
from selfdrive.car import apply_std_steer_torque_limits
77
from selfdrive.car.gm import gmcan
8-
from selfdrive.car.gm.values import DBC, CanBus, CarControllerParams, EV_CAR
8+
from selfdrive.car.gm.values import DBC, CanBus, CarControllerParams, CruiseButtons, EV_CAR
99

1010
VisualAlert = car.CarControl.HUDControl.VisualAlert
1111
NetworkLocation = car.CarParams.NetworkLocation
@@ -19,6 +19,7 @@ def __init__(self, dbc_name, CP, VM):
1919
self.apply_gas = 0
2020
self.apply_brake = 0
2121
self.frame = 0
22+
self.last_button_frame = 0
2223

2324
self.lka_steering_cmd_counter_last = -1
2425
self.lka_icon_status_last = (False, False)
@@ -46,8 +47,7 @@ def update(self, CC, CS):
4647
if CS.lka_steering_cmd_counter != self.lka_steering_cmd_counter_last:
4748
self.lka_steering_cmd_counter_last = CS.lka_steering_cmd_counter
4849
elif (self.frame % self.params.STEER_STEP) == 0:
49-
lkas_enabled = CC.latActive and CS.out.vEgo > self.params.MIN_STEER_SPEED
50-
if lkas_enabled:
50+
if CC.latActive:
5151
new_steer = int(round(actuators.steer * self.params.STEER_MAX))
5252
apply_steer = apply_std_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorque, self.params)
5353
else:
@@ -58,7 +58,7 @@ def update(self, CC, CS):
5858
# moment of disengaging, increment the counter based on the last message known to pass Panda safety checks.
5959
idx = (CS.lka_steering_cmd_counter + 1) % 4
6060

61-
can_sends.append(gmcan.create_steering_control(self.packer_pt, CanBus.POWERTRAIN, apply_steer, idx, lkas_enabled))
61+
can_sends.append(gmcan.create_steering_control(self.packer_pt, CanBus.POWERTRAIN, apply_steer, idx, CC.latActive))
6262

6363
if self.CP.openpilotLongitudinalControl:
6464
# Gas/regen, brakes, and UI commands - all at 25Hz
@@ -107,13 +107,22 @@ def update(self, CC, CS):
107107
if self.CP.networkLocation == NetworkLocation.gateway and self.frame % self.params.ADAS_KEEPALIVE_STEP == 0:
108108
can_sends += gmcan.create_adas_keepalive(CanBus.POWERTRAIN)
109109

110+
else:
111+
# Stock longitudinal, integrated at camera
112+
if (self.frame - self.last_button_frame) * DT_CTRL > 0.1:
113+
if CC.cruiseControl.cancel:
114+
self.last_button_frame = self.frame
115+
can_sends.append(gmcan.create_buttons(self.packer_pt, CanBus.CAMERA, CruiseButtons.CANCEL))
116+
110117
# Show green icon when LKA torque is applied, and
111118
# alarming orange icon when approaching torque limit.
112119
# If not sent again, LKA icon disappears in about 5 seconds.
113120
# Conveniently, sending camera message periodically also works as a keepalive.
114121
lka_active = CS.lkas_status == 1
115122
lka_critical = lka_active and abs(actuators.steer) > 0.9
116123
lka_icon_status = (lka_active, lka_critical)
124+
125+
# SW_GMLAN not yet on cam harness, no HUD alerts
117126
if self.CP.networkLocation != NetworkLocation.fwdCamera and (self.frame % self.params.CAMERA_KEEPALIVE_STEP == 0 or lka_icon_status != self.lka_icon_status_last):
118127
steer_alert = hud_alert in (VisualAlert.steerRequired, VisualAlert.ldw)
119128
can_sends.append(gmcan.create_lka_icon_command(CanBus.SW_GMLAN, lka_active, lka_critical, steer_alert))

selfdrive/car/gm/carstate.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from cereal import car
2+
from common.conversions import Conversions as CV
23
from common.numpy_fast import mean
34
from opendbc.can.can_define import CANDefine
45
from opendbc.can.parser import CANParser
56
from selfdrive.car.interfaces import CarStateBase
67
from selfdrive.car.gm.values import DBC, AccState, CanBus, STEER_THRESHOLD
78

89
TransmissionType = car.CarParams.TransmissionType
10+
NetworkLocation = car.CarParams.NetworkLocation
911

1012

1113
class CarState(CarStateBase):
@@ -15,7 +17,7 @@ def __init__(self, CP):
1517
self.shifter_values = can_define.dv["ECMPRDNL2"]["PRNDL2"]
1618
self.lka_steering_cmd_counter = 0
1719

18-
def update(self, pt_cp, loopback_cp):
20+
def update(self, pt_cp, cam_cp, loopback_cp):
1921
ret = car.CarState.new_message()
2022

2123
self.prev_cruise_buttons = self.cruise_buttons
@@ -77,9 +79,21 @@ def update(self, pt_cp, loopback_cp):
7779

7880
ret.cruiseState.enabled = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] != AccState.OFF
7981
ret.cruiseState.standstill = pt_cp.vl["AcceleratorPedal2"]["CruiseState"] == AccState.STANDSTILL
82+
if self.CP.networkLocation == NetworkLocation.fwdCamera:
83+
ret.cruiseState.speed = (cam_cp.vl["ASCMActiveCruiseControlStatus"]["ACCSpeedSetpoint"] / 16) * CV.KPH_TO_MS
8084

8185
return ret
8286

87+
@staticmethod
88+
def get_cam_can_parser(CP):
89+
signals = []
90+
checks = []
91+
if CP.networkLocation == NetworkLocation.fwdCamera:
92+
signals.append(("ACCSpeedSetpoint", "ASCMActiveCruiseControlStatus"))
93+
checks.append(("ASCMActiveCruiseControlStatus", 25))
94+
95+
return CANParser(DBC[CP.carFingerprint]["pt"], signals, checks, CanBus.CAMERA)
96+
8397
@staticmethod
8498
def get_can_parser(CP):
8599
signals = [

selfdrive/car/gm/gmcan.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
from selfdrive.car import make_can_msg
22

3+
def create_buttons(packer, bus, button):
4+
values = {"ACCButtons": button}
5+
return packer.make_can_msg("ASCMSteeringButton", bus, values)
6+
37
def create_steering_control(packer, bus, apply_steer, idx, lkas_active):
48

59
values = {

selfdrive/car/gm/interface.py

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
#!/usr/bin/env python3
22
from cereal import car
33
from math import fabs
4+
from panda import Panda
45

56
from common.conversions import Conversions as CV
67
from selfdrive.car import STD_CARGO_KG, create_button_enable_events, create_button_event, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint, get_safety_config
7-
from selfdrive.car.gm.values import CAR, CruiseButtons, CarControllerParams
8+
from selfdrive.car.gm.values import CAR, CruiseButtons, CarControllerParams, EV_CAR, CAMERA_ACC_CAR
89
from selfdrive.car.interfaces import CarInterfaceBase
910

1011
ButtonType = car.CarState.ButtonEvent.Type
@@ -48,29 +49,36 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None, disa
4849
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
4950
ret.carName = "gm"
5051
ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.gm)]
51-
ret.pcmCruise = False # For ASCM, stock non-adaptive cruise control is kept off
52-
ret.radarOffCan = False # For ASCM, radar exists
53-
ret.transmissionType = TransmissionType.automatic
54-
# NetworkLocation.gateway: OBD-II harness (typically ASCM), NetworkLocation.fwdCamera: non-ASCM
55-
ret.networkLocation = NetworkLocation.gateway
52+
53+
if candidate in EV_CAR:
54+
ret.transmissionType = TransmissionType.direct
55+
else:
56+
ret.transmissionType = TransmissionType.automatic
57+
58+
if candidate in CAMERA_ACC_CAR:
59+
ret.openpilotLongitudinalControl = False
60+
ret.networkLocation = NetworkLocation.fwdCamera
61+
ret.radarOffCan = True # no radar
62+
ret.pcmCruise = True
63+
ret.safetyConfigs[0].safetyParam |= Panda.FLAG_GM_HW_CAM
64+
else: # ASCM, OBD-II harness
65+
ret.openpilotLongitudinalControl = True
66+
ret.networkLocation = NetworkLocation.gateway
67+
ret.radarOffCan = False
68+
ret.pcmCruise = False # stock non-adaptive cruise control is kept off
5669

5770
# These cars have been put into dashcam only due to both a lack of users and test coverage.
5871
# These cars likely still work fine. Once a user confirms each car works and a test route is
5972
# added to selfdrive/car/tests/routes.py, we can remove it from this list.
6073
ret.dashcamOnly = candidate in {CAR.CADILLAC_ATS, CAR.HOLDEN_ASTRA, CAR.MALIBU, CAR.BUICK_REGAL}
6174

62-
# Presence of a camera on the object bus is ok.
63-
# Have to go to read_only if ASCM is online (ACC-enabled cars),
64-
# or camera is on powertrain bus (LKA cars without ACC).
65-
ret.openpilotLongitudinalControl = True
66-
tire_stiffness_factor = 0.444 # not optimized yet
67-
6875
# Start with a baseline tuning for all GM vehicles. Override tuning as needed in each model section below.
6976
ret.minSteerSpeed = 7 * CV.MPH_TO_MS
7077
ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[0.], [0.]]
7178
ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.00]]
7279
ret.lateralTuning.pid.kf = 0.00004 # full torque for 20 deg at 80mph means 0.00007818594
7380
ret.steerActuatorDelay = 0.1 # Default delay, not measured yet
81+
tire_stiffness_factor = 0.444 # not optimized yet
7482

7583
ret.longitudinalTuning.kpBP = [5., 35.]
7684
ret.longitudinalTuning.kpV = [2.4, 1.5]
@@ -84,7 +92,6 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None, disa
8492
ret.minEnableSpeed = 18 * CV.MPH_TO_MS
8593

8694
if candidate == CAR.VOLT:
87-
ret.transmissionType = TransmissionType.direct
8895
ret.mass = 1607. + STD_CARGO_KG
8996
ret.wheelbase = 2.69
9097
ret.steerRatio = 17.7 # Stock 15.7, LiveParameters
@@ -143,6 +150,16 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None, disa
143150
ret.lateralTuning.pid.kf = 0.000045
144151
tire_stiffness_factor = 1.0
145152

153+
elif candidate == CAR.BOLT_EUV:
154+
ret.minEnableSpeed = -1
155+
ret.mass = 1669. + STD_CARGO_KG
156+
ret.wheelbase = 2.675
157+
ret.steerRatio = 16.8
158+
ret.centerToFront = ret.wheelbase * 0.4
159+
tire_stiffness_factor = 1.0
160+
ret.steerActuatorDelay = 0.2
161+
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
162+
146163
# TODO: get actual value, for now starting with reasonable value for
147164
# civic and scaling by mass and wheelbase
148165
ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase)
@@ -156,7 +173,7 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None, disa
156173

157174
# returns a car.CarState
158175
def _update(self, c):
159-
ret = self.CS.update(self.cp, self.cp_loopback)
176+
ret = self.CS.update(self.cp, self.cp_cam, self.cp_loopback)
160177

161178
if self.CS.cruise_buttons != self.CS.prev_cruise_buttons and self.CS.prev_cruise_buttons != CruiseButtons.INIT:
162179
be = create_button_event(self.CS.cruise_buttons, self.CS.prev_cruise_buttons, BUTTONS_DICT, CruiseButtons.UNPRESS)

selfdrive/car/gm/values.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ class CarControllerParams:
1414
STEER_STEP = 2 # Control frames per command (50hz)
1515
STEER_DELTA_UP = 7 # Delta rates require review due to observed EPS weakness
1616
STEER_DELTA_DOWN = 17
17-
MIN_STEER_SPEED = 3. # m/s
1817
STEER_DRIVER_ALLOWANCE = 50
1918
STEER_DRIVER_MULTIPLIER = 4
2019
STEER_DRIVER_FACTOR = 100
@@ -59,10 +58,7 @@ class CAR:
5958
ACADIA = "GMC ACADIA DENALI 2018"
6059
BUICK_REGAL = "BUICK REGAL ESSENCE 2018"
6160
ESCALADE_ESV = "CADILLAC ESCALADE ESV 2016"
62-
63-
64-
EV_CAR = {CAR.VOLT}
65-
STEER_THRESHOLD = 1.0
61+
BOLT_EUV = "CHEVROLET BOLT EUV 2022"
6662

6763

6864
class Footnote(Enum):
@@ -87,6 +83,7 @@ class GMCarInfo(CarInfo):
8783
CAR.ACADIA: GMCarInfo("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo"),
8884
CAR.BUICK_REGAL: GMCarInfo("Buick Regal Essence 2018"),
8985
CAR.ESCALADE_ESV: GMCarInfo("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS"),
86+
CAR.BOLT_EUV: GMCarInfo("Chevrolet Bolt EUV 2022-23", "All", footnotes=[], harness=Harness.gm),
9087
}
9188

9289

@@ -107,6 +104,7 @@ class AccState:
107104
class CanBus:
108105
POWERTRAIN = 0
109106
OBSTACLE = 1
107+
CAMERA = 2
110108
CHASSIS = 2
111109
SW_GMLAN = 3
112110
LOOPBACK = 128
@@ -155,6 +153,17 @@ class CanBus:
155153
{
156154
309: 1, 848: 8, 849: 8, 850: 8, 851: 8, 852: 8, 853: 8, 854: 3, 1056: 6, 1057: 8, 1058: 8, 1059: 8, 1060: 8, 1061: 8, 1062: 8, 1063: 8, 1064: 8, 1065: 8, 1066: 8, 1067: 8, 1068: 8, 1120: 8, 1121: 8, 1122: 8, 1123: 8, 1124: 8, 1125: 8, 1126: 8, 1127: 8, 1128: 8, 1129: 8, 1130: 8, 1131: 8, 1132: 8, 1133: 8, 1134: 8, 1135: 8, 1136: 8, 1137: 8, 1138: 8, 1139: 8, 1140: 8, 1141: 8, 1142: 8, 1143: 8, 1146: 8, 1147: 8, 1148: 8, 1149: 8, 1150: 8, 1151: 8, 1216: 8, 1217: 8, 1218: 8, 1219: 8, 1220: 8, 1221: 8, 1222: 8, 1223: 8, 1224: 8, 1225: 8, 1226: 8, 1232: 8, 1233: 8, 1234: 8, 1235: 8, 1236: 8, 1237: 8, 1238: 8, 1239: 8, 1240: 8, 1241: 8, 1242: 8, 1787: 8, 1788: 8
157155
}],
156+
CAR.BOLT_EUV: [
157+
{
158+
189: 7, 190: 7, 193: 8, 197: 8, 201: 8, 209: 7, 211: 3, 241: 6, 257: 8, 288: 5, 289: 8, 298: 8, 304: 3, 309: 8, 311: 8, 313: 8, 320: 4, 322: 7, 328: 1, 352: 5, 381: 8, 384: 4, 386: 8, 388: 8, 451: 8, 452: 8, 453: 6, 458: 5, 463: 3, 479: 3, 481: 7, 485: 8, 489: 8, 497: 8, 500: 6, 501: 8, 528: 5, 532: 6, 560: 8, 562: 8, 563: 5, 565: 5, 566: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 707: 8, 715: 8, 717: 5, 753: 5, 761: 7, 789: 5, 800: 6, 810: 8, 840: 5, 842: 5, 844: 8, 848: 4, 869: 4, 880: 6, 977: 8, 1001: 8, 1017: 8, 1020: 8, 1217: 8, 1221: 5, 1233: 8, 1249: 8, 1265: 8, 1280: 4, 1296: 4, 1300: 8, 1930: 7
159+
}],
158160
}
159161

160162
DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict('gm_global_a_powertrain_generated', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis'))
163+
164+
EV_CAR = {CAR.VOLT, CAR.BOLT_EUV}
165+
166+
# We're integrated at the camera with VOACC on these cars (instead of ASCM w/ OBD-II harness)
167+
CAMERA_ACC_CAR = {CAR.BOLT_EUV}
168+
169+
STEER_THRESHOLD = 1.0

selfdrive/car/tests/routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
TestRoute("aa20e335f61ba898|2019-02-05--16-59-04", GM.BUICK_REGAL),
4848
TestRoute("46460f0da08e621e|2021-10-26--07-21-46", GM.ESCALADE_ESV),
4949
TestRoute("c950e28c26b5b168|2018-05-30--22-03-41", GM.VOLT),
50+
TestRoute("f08912a233c1584f|2022-08-11--18-02-41", GM.BOLT_EUV),
5051

5152
TestRoute("0e7a2ba168465df5|2020-10-18--14-14-22", HONDA.ACURA_RDX_3G),
5253
TestRoute("a74b011b32b51b56|2020-07-26--17-09-36", HONDA.CIVIC),

0 commit comments

Comments
 (0)