Skip to content

Commit 0080c76

Browse files
committed
Grey and white panda are supported
1 parent aed724b commit 0080c76

28 files changed

+145
-82
lines changed

selfdrive/car/car_helpers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,11 @@ def only_toyota_left(candidate_cars):
8484

8585

8686
# **** for use live only ****
87-
def fingerprint(logcan, sendcan):
87+
def fingerprint(logcan, sendcan, has_relay):
8888
fixed_fingerprint = os.environ.get('FINGERPRINT', "")
8989
skip_fw_query = os.environ.get('SKIP_FW_QUERY', False)
9090

91-
if not fixed_fingerprint and not skip_fw_query:
91+
if has_relay and not fixed_fingerprint and not skip_fw_query:
9292
# Vin query only reliably works thorugh OBDII
9393
bus = 1
9494

@@ -170,15 +170,15 @@ def fingerprint(logcan, sendcan):
170170
return car_fingerprint, finger, vin, car_fw, source
171171

172172

173-
def get_car(logcan, sendcan):
174-
candidate, fingerprints, vin, car_fw, source = fingerprint(logcan, sendcan)
173+
def get_car(logcan, sendcan, has_relay=False):
174+
candidate, fingerprints, vin, car_fw, source = fingerprint(logcan, sendcan, has_relay)
175175

176176
if candidate is None:
177177
cloudlog.warning("car doesn't match any fingerprints: %r", fingerprints)
178178
candidate = "mock"
179179

180180
CarInterface, CarController, CarState = interfaces[candidate]
181-
car_params = CarInterface.get_params(candidate, fingerprints, car_fw)
181+
car_params = CarInterface.get_params(candidate, fingerprints, has_relay, car_fw)
182182
car_params.carVin = vin
183183
car_params.carFw = car_fw
184184
car_params.fingerprintSource = source

selfdrive/car/chrysler/interface.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/usr/bin/env python3
22
from cereal import car
3-
from selfdrive.car.chrysler.values import CAR
4-
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
3+
from selfdrive.car.chrysler.values import Ecu, ECU_FINGERPRINT, CAR, FINGERPRINTS
4+
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, is_ecu_disconnected, gen_empty_fingerprint
55
from selfdrive.car.interfaces import CarInterfaceBase
66

77

@@ -11,11 +11,11 @@ def compute_gb(accel, speed):
1111
return float(accel) / 3.0
1212

1313
@staticmethod
14-
def get_params(candidate, fingerprint=None, car_fw=None):
14+
def get_params(candidate, fingerprint=None, has_relay=False, car_fw=None):
1515
if fingerprint is None:
1616
fingerprint = gen_empty_fingerprint()
1717

18-
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
18+
ret = CarInterfaceBase.get_std_params(candidate, fingerprint, has_relay)
1919
ret.carName = "chrysler"
2020
ret.safetyModel = car.CarParams.SafetyModel.chrysler
2121

@@ -52,7 +52,8 @@ def get_params(candidate, fingerprint=None, car_fw=None):
5252
# mass and CG position, so all cars will have approximately similar dyn behaviors
5353
ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront)
5454

55-
ret.enableCamera = True
55+
ret.enableCamera = is_ecu_disconnected(fingerprint[0], FINGERPRINTS, ECU_FINGERPRINT, candidate, Ecu.fwdCamera) or has_relay
56+
print("ECU Camera Simulated: {0}".format(ret.enableCamera))
5657

5758
return ret
5859

selfdrive/car/chrysler/values.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,7 @@ class CAR:
9191
}
9292

9393
STEER_THRESHOLD = 120
94+
95+
ECU_FINGERPRINT = {
96+
Ecu.fwdCamera: [0x292], # lkas cmd
97+
}

selfdrive/car/ford/interface.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from cereal import car
33
from selfdrive.swaglog import cloudlog
44
from selfdrive.config import Conversions as CV
5-
from selfdrive.car.ford.values import MAX_ANGLE
6-
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
5+
from selfdrive.car.ford.values import MAX_ANGLE, Ecu, ECU_FINGERPRINT, FINGERPRINTS
6+
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, is_ecu_disconnected, gen_empty_fingerprint
77
from selfdrive.car.interfaces import CarInterfaceBase
88

99

@@ -14,8 +14,8 @@ def compute_gb(accel, speed):
1414
return float(accel) / 3.0
1515

1616
@staticmethod
17-
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
18-
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
17+
def get_params(candidate, fingerprint=gen_empty_fingerprint(), has_relay=False, car_fw=None):
18+
ret = CarInterfaceBase.get_std_params(candidate, fingerprint, has_relay)
1919
ret.carName = "ford"
2020
ret.safetyModel = car.CarParams.SafetyModel.ford
2121
ret.dashcamOnly = True
@@ -43,7 +43,7 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
4343

4444
ret.steerControlType = car.CarParams.SteerControlType.angle
4545

46-
ret.enableCamera = True
46+
ret.enableCamera = is_ecu_disconnected(fingerprint[0], FINGERPRINTS, ECU_FINGERPRINT, candidate, Ecu.fwdCamera) or has_relay
4747
cloudlog.warning("ECU Camera Simulated: %r", ret.enableCamera)
4848

4949
return ret

selfdrive/car/ford/values.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ class CAR:
1515
}],
1616
}
1717

18+
ECU_FINGERPRINT = {
19+
Ecu.fwdCamera: [970, 973, 984]
20+
}
21+
1822
DBC = {
1923
CAR.FUSION: dbc_dict('ford_fusion_2018_pt', 'ford_fusion_2018_adas'),
2024
}

selfdrive/car/gm/interface.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
#!/usr/bin/env python3
22
from cereal import car
33
from selfdrive.config import Conversions as CV
4-
from selfdrive.car.gm.values import CAR, CruiseButtons, \
5-
AccState
6-
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint
4+
from selfdrive.car.gm.values import CAR, Ecu, ECU_FINGERPRINT, CruiseButtons, \
5+
AccState, FINGERPRINTS
6+
from selfdrive.car import STD_CARGO_KG, scale_rot_inertia, scale_tire_stiffness, is_ecu_disconnected, gen_empty_fingerprint
77
from selfdrive.car.interfaces import CarInterfaceBase
88

99
ButtonType = car.CarState.ButtonEvent.Type
@@ -16,8 +16,8 @@ def compute_gb(accel, speed):
1616
return float(accel) / 4.0
1717

1818
@staticmethod
19-
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
20-
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
19+
def get_params(candidate, fingerprint=gen_empty_fingerprint(), has_relay=False, car_fw=None):
20+
ret = CarInterfaceBase.get_std_params(candidate, fingerprint, has_relay)
2121
ret.carName = "gm"
2222
ret.safetyModel = car.CarParams.SafetyModel.gm
2323
ret.enableCruise = False # stock cruise control is kept off
@@ -29,7 +29,7 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
2929
# Presence of a camera on the object bus is ok.
3030
# Have to go to read_only if ASCM is online (ACC-enabled cars),
3131
# or camera is on powertrain bus (LKA cars without ACC).
32-
ret.enableCamera = True
32+
ret.enableCamera = is_ecu_disconnected(fingerprint[0], FINGERPRINTS, ECU_FINGERPRINT, candidate, Ecu.fwdCamera) or has_relay
3333
ret.openpilotLongitudinalControl = ret.enableCamera
3434
tire_stiffness_factor = 0.444 # not optimized yet
3535

selfdrive/car/gm/values.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ class CanBus:
9797

9898
STEER_THRESHOLD = 1.0
9999

100+
ECU_FINGERPRINT = {
101+
Ecu.fwdCamera: [384, 715] # 384 = "ASCMLKASteeringCmd", 715 = "ASCMGasRegenCmd"
102+
}
103+
100104
DBC = {
101105
CAR.HOLDEN_ASTRA: dbc_dict('gm_global_a_powertrain', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis'),
102106
CAR.VOLT: dbc_dict('gm_global_a_powertrain', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis'),

selfdrive/car/honda/carcontroller.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -136,22 +136,22 @@ def update(self, enabled, CS, frame, actuators,
136136
# Send steering command.
137137
idx = frame % 4
138138
can_sends.append(hondacan.create_steering_control(self.packer, apply_steer,
139-
lkas_active, CS.CP.carFingerprint, idx, CS.CP.openpilotLongitudinalControl))
139+
lkas_active, CS.CP.carFingerprint, idx, CS.CP.isPandaBlackDEPRECATED, CS.CP.openpilotLongitudinalControl))
140140

141141
# Send dashboard UI commands.
142142
if (frame % 10) == 0:
143143
idx = (frame//10) % 4
144-
can_sends.extend(hondacan.create_ui_commands(self.packer, pcm_speed, hud, CS.CP.carFingerprint, CS.is_metric, idx, CS.CP.openpilotLongitudinalControl, CS.stock_hud))
144+
can_sends.extend(hondacan.create_ui_commands(self.packer, pcm_speed, hud, CS.CP.carFingerprint, CS.is_metric, idx, CS.CP.isPandaBlackDEPRECATED, CS.CP.openpilotLongitudinalControl, CS.stock_hud))
145145

146146
if not CS.CP.openpilotLongitudinalControl:
147147
if (frame % 2) == 0:
148148
idx = frame // 2
149-
can_sends.append(hondacan.create_bosch_supplemental_1(self.packer, CS.CP.carFingerprint, idx))
149+
can_sends.append(hondacan.create_bosch_supplemental_1(self.packer, CS.CP.carFingerprint, idx, CS.CP.isPandaBlackDEPRECATED))
150150
# If using stock ACC, spam cancel command to kill gas when OP disengages.
151151
if pcm_cancel_cmd:
152-
can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.CANCEL, idx, CS.CP.carFingerprint))
152+
can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.CANCEL, idx, CS.CP.carFingerprint, CS.CP.isPandaBlackDEPRECATED))
153153
elif CS.out.cruiseState.standstill:
154-
can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.RES_ACCEL, idx, CS.CP.carFingerprint))
154+
can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.RES_ACCEL, idx, CS.CP.carFingerprint, CS.CP.isPandaBlackDEPRECATED))
155155

156156
else:
157157
# Send gas and brake commands.
@@ -165,7 +165,7 @@ def update(self, enabled, CS, frame, actuators,
165165
apply_brake = int(clip(self.brake_last * P.BRAKE_MAX, 0, P.BRAKE_MAX - 1))
166166
pump_on, self.last_pump_ts = brake_pump_hysteresis(apply_brake, self.apply_brake_last, self.last_pump_ts, ts)
167167
can_sends.append(hondacan.create_brake_command(self.packer, apply_brake, pump_on,
168-
pcm_override, pcm_cancel_cmd, hud.fcw, idx, CS.CP.carFingerprint, CS.stock_brake))
168+
pcm_override, pcm_cancel_cmd, hud.fcw, idx, CS.CP.carFingerprint, CS.CP.isPandaBlackDEPRECATED, CS.stock_brake))
169169
self.apply_brake_last = apply_brake
170170

171171
if CS.CP.enableGasInterceptor:

selfdrive/car/honda/carstate.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ def update(self, cp, cp_cam, cp_body):
336336
@staticmethod
337337
def get_can_parser(CP):
338338
signals, checks = get_can_signals(CP)
339-
bus_pt = 1 if CP.carFingerprint in HONDA_BOSCH else 0
339+
bus_pt = 1 if CP.isPandaBlackDEPRECATED and CP.carFingerprint in HONDA_BOSCH else 0
340340
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, bus_pt)
341341

342342
@staticmethod
@@ -361,7 +361,8 @@ def get_cam_can_parser(CP):
361361
if CP.carFingerprint in [CAR.CRV, CAR.CRV_EU, CAR.ACURA_RDX, CAR.ODYSSEY_CHN]:
362362
checks = [(0x194, 100)]
363363

364-
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)
364+
bus_cam = 1 if CP.carFingerprint in HONDA_BOSCH and not CP.isPandaBlackDEPRECATED else 2
365+
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, bus_cam)
365366

366367
@staticmethod
367368
def get_body_can_parser(CP):

selfdrive/car/honda/hondacan.py

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,24 @@
77
# 2 = ACC-CAN - camera side
88
# 3 = F-CAN A - OBDII port
99

10-
def get_pt_bus(car_fingerprint):
11-
return 1 if car_fingerprint in HONDA_BOSCH else 0
10+
# CAN bus layout with giraffe
11+
# 0 = F-CAN B - powertrain
12+
# 1 = ACC-CAN - camera side
13+
# 2 = ACC-CAN - radar side
1214

15+
def get_pt_bus(car_fingerprint, has_relay):
16+
return 1 if car_fingerprint in HONDA_BOSCH and has_relay else 0
1317

14-
def get_lkas_cmd_bus(car_fingerprint, radar_disabled=False):
18+
19+
def get_lkas_cmd_bus(car_fingerprint, has_relay, radar_disabled=False):
1520
if radar_disabled:
1621
# when radar is disabled, steering commands are sent directly to powertrain bus
17-
return get_pt_bus(car_fingerprint)
22+
return get_pt_bus(car_fingerprint, has_relay)
1823
# normally steering commands are sent to radar, which forwards them to powertrain bus
19-
return 0
24+
return 2 if car_fingerprint in HONDA_BOSCH and not has_relay else 0
2025

2126

22-
def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, idx, car_fingerprint, stock_brake):
27+
def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, idx, car_fingerprint, has_relay, stock_brake):
2328
# TODO: do we loose pressure if we keep pump off for long?
2429
brakelights = apply_brake > 0
2530
brake_rq = apply_brake > 0
@@ -40,13 +45,13 @@ def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_
4045
"AEB_REQ_2": 0,
4146
"AEB_STATUS": 0,
4247
}
43-
bus = get_pt_bus(car_fingerprint)
48+
bus = get_pt_bus(car_fingerprint, has_relay)
4449
return packer.make_can_msg("BRAKE_COMMAND", bus, values, idx)
4550

4651

47-
def create_acc_commands(packer, enabled, accel, gas, idx, stopping, starting, car_fingerprint):
52+
def create_acc_commands(packer, enabled, accel, gas, idx, stopping, starting, car_fingerprint, has_relay):
4853
commands = []
49-
bus = get_pt_bus(car_fingerprint)
54+
bus = get_pt_bus(car_fingerprint, has_relay)
5055

5156
control_on = 5 if enabled else 0
5257
# no gas = -30000
@@ -79,31 +84,31 @@ def create_acc_commands(packer, enabled, accel, gas, idx, stopping, starting, ca
7984

8085
return commands
8186

82-
def create_steering_control(packer, apply_steer, lkas_active, car_fingerprint, idx, radar_disabled):
87+
def create_steering_control(packer, apply_steer, lkas_active, car_fingerprint, idx, has_relay, radar_disabled):
8388
values = {
8489
"STEER_TORQUE": apply_steer if lkas_active else 0,
8590
"STEER_TORQUE_REQUEST": lkas_active,
8691
}
87-
bus = get_lkas_cmd_bus(car_fingerprint, radar_disabled)
92+
bus = get_lkas_cmd_bus(car_fingerprint, has_relay, radar_disabled)
8893
return packer.make_can_msg("STEERING_CONTROL", bus, values, idx)
8994

9095

91-
def create_bosch_supplemental_1(packer, car_fingerprint, idx):
96+
def create_bosch_supplemental_1(packer, car_fingerprint, idx, has_relay):
9297
# non-active params
9398
values = {
9499
"SET_ME_X04": 0x04,
95100
"SET_ME_X80": 0x80,
96101
"SET_ME_X10": 0x10,
97102
}
98-
bus = get_lkas_cmd_bus(car_fingerprint)
103+
bus = get_lkas_cmd_bus(car_fingerprint, has_relay)
99104
return packer.make_can_msg("BOSCH_SUPPLEMENTAL_1", bus, values, idx)
100105

101106

102-
def create_ui_commands(packer, pcm_speed, hud, car_fingerprint, is_metric, idx, openpilot_longitudinal_control, stock_hud):
107+
def create_ui_commands(packer, pcm_speed, hud, car_fingerprint, is_metric, idx, has_relay, openpilot_longitudinal_control, stock_hud):
103108
commands = []
104-
bus_pt = get_pt_bus(car_fingerprint)
109+
bus_pt = get_pt_bus(car_fingerprint, has_relay)
105110
radar_disabled = car_fingerprint in HONDA_BOSCH and openpilot_longitudinal_control
106-
bus_lkas = get_lkas_cmd_bus(car_fingerprint, radar_disabled)
111+
bus_lkas = get_lkas_cmd_bus(car_fingerprint, has_relay, radar_disabled)
107112

108113
if openpilot_longitudinal_control:
109114
if car_fingerprint in HONDA_BOSCH:
@@ -153,10 +158,10 @@ def create_ui_commands(packer, pcm_speed, hud, car_fingerprint, is_metric, idx,
153158
return commands
154159

155160

156-
def spam_buttons_command(packer, button_val, idx, car_fingerprint):
161+
def spam_buttons_command(packer, button_val, idx, car_fingerprint, has_relay):
157162
values = {
158163
'CRUISE_BUTTONS': button_val,
159164
'CRUISE_SETTING': 0,
160165
}
161-
bus = get_pt_bus(car_fingerprint)
166+
bus = get_pt_bus(car_fingerprint, has_relay)
162167
return packer.make_can_msg("SCM_BUTTONS", bus, values, idx)

0 commit comments

Comments
 (0)