Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
109 commits
Select commit Hold shift + click to select a range
b464ceb
Add secoc ACC command
chrispypatt Oct 18, 2024
ce6b289
Remove commented out secoc long disable code
chrispypatt Oct 18, 2024
9d7aeb5
Merge branch 'commaai:master' into secoc-long
chrispypatt Oct 18, 2024
490067a
Add Toyota 2021 SecOC route
chrispypatt Oct 19, 2024
b4c0dfe
Merge branch 'commaai:master' into secoc-long
chrispypatt Nov 2, 2024
a80efda
Send 0 accel for ACC_CONTROL to match stock
chrispypatt Nov 2, 2024
e40e36b
Merge branch 'commaai:master' into secoc-long
chrispypatt Nov 2, 2024
c5aec84
Update opendbc/car/toyota/carcontroller.py
chrispypatt Nov 5, 2024
27d7ff1
Merge branch 'commaai:master' into secoc-long
chrispypatt Nov 5, 2024
d838cea
Merge branch 'commaai:master' into secoc-long
chrispypatt Nov 18, 2024
018b66a
Merge branch 'commaai:master' into secoc-long
chrispypatt Dec 3, 2024
4d2a2c8
Merge branch 'master' into secoc-long
chrispypatt Dec 11, 2024
83f6773
Merge branch 'master' into secoc-long
chrispypatt Dec 13, 2024
95573ec
Merge branch 'master' into secoc-long
chrispypatt Dec 18, 2024
a518449
Merge SecOC long changes from chrispypatt.
PenitentTangent2401 Dec 30, 2024
49f08dc
Add new ACC steering wheel message for SecOC cars. Update distance_bu…
PenitentTangent2401 Dec 30, 2024
b0ff993
Add new DBC file for Toyota SecOC cars.
PenitentTangent2401 Dec 30, 2024
75fcf63
Update Toyota Rav4 Prime and 4th Gen Sienna to use SecOC DBC file.
PenitentTangent2401 Dec 30, 2024
fc029da
Merge branch 'commaai:master' into secoc-long
chrispypatt Dec 31, 2024
0a0e2db
Merge pull request #1 from PenitentTangent2401/distance
chrispypatt Dec 31, 2024
287da0b
Merge remote-tracking branch 'comma/master' into secoc-long
chrispypatt Jan 12, 2025
9399509
Merge branch 'master' into secoc-long
chrispypatt Jan 15, 2025
184929a
Update carstate.py l
chrispypatt Jan 15, 2025
0ea63f5
Merge branch 'master' into secoc-long
chrispypatt Jan 17, 2025
d908d65
dont save button state on secoc
chrispypatt Jan 24, 2025
109354a
Update opendbc/car/toyota/carstate.py
chrispypatt Jan 24, 2025
fef1954
Remove unreachable code
chrispypatt Jan 25, 2025
1d02e07
Merge branch 'commaai:master' into secoc-long
chrispypatt Feb 15, 2025
47abe79
Merge branch 'commaai:master' into secoc-long
chrispypatt Feb 20, 2025
bccfbdc
Move secoc safety to opendbc
chrispypatt Feb 20, 2025
c361ad1
Merge branch 'master' into secoc-long
chrispypatt Feb 21, 2025
636278f
Merge branch 'master' into secoc-long
chrispypatt Feb 22, 2025
5a9e671
Merge remote-tracking branch 'comma/master' into secoc-long
chrispypatt Feb 27, 2025
da0b102
Merge branch 'master' into secoc-long
chrispypatt Mar 3, 2025
015fc13
Merge branch 'master' into secoc-long
chrispypatt Mar 4, 2025
4b26706
Merge branch 'master' into secoc-long
chrispypatt Mar 6, 2025
7ab4338
Merge branch 'commaai:master' into secoc-long
chrispypatt Mar 7, 2025
b080a60
Update R4P SecOC route
chrispypatt Mar 7, 2025
872a2d2
Merge branch 'master' into secoc-long
chrispypatt Mar 7, 2025
b8f2d43
Merge branch 'master' into secoc-long
chrispypatt Mar 10, 2025
dd50846
Merge branch 'master' into secoc-long
chrispypatt Mar 11, 2025
9344ecb
Build safety with -Wextra
sshane Mar 11, 2025
0de6405
safety: relay malfunction config (#1959)
sshane Mar 11, 2025
944f7a2
Hyundai: dashcam FCEV (#1973)
sshane Mar 11, 2025
feeda99
Hyundai CAN FD: Accurate hybrid powertrain detection (#1891)
sunnyhaibin Mar 11, 2025
be951c8
Tesla: Autopilot enabled signal (#1978)
lukasloetkolben Mar 11, 2025
f4a2514
Tesla: fix incorrect DBC msg length (#1980)
sshane Mar 11, 2025
412b364
Subaru Pre-Global: fix missing rx checks (#1982)
sshane Mar 11, 2025
127fca6
Honda Nidec: missing brake command rx check (#1981)
sshane Mar 11, 2025
fdfc8f3
Honda safety: only test alt brake for alt brake param
sshane Mar 11, 2025
9516061
safety tests: remove redundant test skips (#1983)
sshane Mar 12, 2025
f7a8175
GM safety: add missing regen rx check (#1984)
sshane Mar 12, 2025
4570e2b
Fingerprint: 2022 Civic Si (#1952)
vanillagorillaa Mar 12, 2025
ffb98d9
Hyundai CAN FD safety: more clear what is common (#1986)
sshane Mar 12, 2025
2915102
Hyundai CANFD safety tests: common safety param combinations (#1987)
sshane Mar 12, 2025
8aa8e92
Hyundai CAN FD safety: replace alt buttons live detection with param …
sshane Mar 12, 2025
8b2162c
Hyundai safety: add missing rx checks (#1989)
sshane Mar 12, 2025
f1e3350
safety: rename allowed
sshane Mar 12, 2025
e711166
safety: only run rx hooks on whitelisted msgs (#1903)
sshane Mar 12, 2025
bb5fa28
Hyundai: Fix FCEV RX check and move out of dashcam (#1974)
sunnyhaibin Mar 12, 2025
2df1502
HKG: spas remove unused frame param (#1966)
royjr Mar 12, 2025
5b438b8
Added FW for Mazda CX5 2025 (#1911)
kenhuang14 Mar 12, 2025
41b67df
Hyundai CAN FD: Fix steering messages in safety replay (#1975)
sunnyhaibin Mar 12, 2025
4aeb000
Hyundai: split car controller by CAN FD (#1990)
sshane Mar 12, 2025
c78b489
Toyota: add static rx check for alt brake (#1991)
sshane Mar 12, 2025
a64125f
whoops bad pull
chrispypatt Mar 12, 2025
382f34e
Merge branch 'master' into secoc-long
chrispypatt Mar 12, 2025
769c528
Merge branch 'master' into secoc-long
chrispypatt Mar 14, 2025
57070f0
Merge branch 'master' into secoc-long
chrispypatt Mar 15, 2025
d3b2a08
Merge branch 'master' into secoc-long
chrispypatt Mar 18, 2025
7676b4a
Merge branch 'master' into secoc-long
chrispypatt Mar 22, 2025
558dac7
Merge branch 'master' into secoc-long
chrispypatt Mar 22, 2025
9b48cc3
Merge branch 'master' into secoc-long
chrispypatt Mar 26, 2025
5d37854
Merge branch 'master' into secoc-long
chrispypatt Mar 30, 2025
fa87739
Merge branch 'master' into secoc-long
chrispypatt Apr 1, 2025
ab8a0e3
PR suggestions
chrispypatt Apr 3, 2025
2df7ce7
Merge branch 'master' into secoc-long
chrispypatt Apr 3, 2025
4bec658
Remove unnecessary parens
chrispypatt Apr 3, 2025
be4653d
PR suggestions
chrispypatt Apr 5, 2025
8edf38f
Fix some logical errors
chrispypatt Apr 5, 2025
8f563ac
Fix tester present test
chrispypatt Apr 5, 2025
2cf6843
Merge remote-tracking branch 'comma/master' into secoc-long
chrispypatt Apr 10, 2025
379c8a1
Merge remote-tracking branch 'origin' into secoc-long
chrispypatt Apr 10, 2025
46efd79
Merge branch 'master' into secoc-long
chrispypatt Apr 10, 2025
7df4b4c
Merge branch 'master' into secoc-long
chrispypatt Apr 10, 2025
8d6ae3e
Merge branch 'master' into secoc-long
chrispypatt Apr 14, 2025
d2a85a1
Update safety for non-op long secoc
chrispypatt Apr 15, 2025
955a6b9
Merge branch 'master' into secoc-long
chrispypatt Apr 15, 2025
ef8fe56
Update tests
chrispypatt Apr 15, 2025
c515573
Update safety
chrispypatt Apr 15, 2025
92c9d0a
Update tests
chrispypatt Apr 15, 2025
f565d2f
Merge branch 'master' into secoc-long
chrispypatt Apr 15, 2025
f9dbd49
Merge branch 'master' into secoc-long
chrispypatt Apr 18, 2025
3fdacca
Merge branch 'master' into secoc-long
chrispypatt Apr 19, 2025
a430188
Merge branch 'master' into secoc-long
chrispypatt Apr 30, 2025
3e577d1
Merge branch 'master' into secoc-long
chrispypatt May 2, 2025
1b22879
Merge branch 'master' into secoc-long
chrispypatt May 10, 2025
2d22a99
Merge branch 'master' into secoc-long
chrispypatt May 12, 2025
2c918a0
Merge branch 'master' into secoc-long
chrispypatt May 13, 2025
34b80e4
Merge branch 'master' into secoc-long
chrispypatt May 16, 2025
b2c6846
Merge remote-tracking branch 'comma/master' into secoc-long
chrispypatt May 21, 2025
6c8f369
Merge branch 'commaai:master' into secoc-long
chrispypatt May 23, 2025
f035559
Merge remote-tracking branch 'origin' into secoc-long
chrispypatt Jul 3, 2025
0261d4b
Merge branch 'master' into secoc-long
wtogami Jul 20, 2025
0b05e00
Merge pull request #3 from wtogami/secoc-long
chrispypatt Jul 20, 2025
2b580c5
Merge branch 'master' of ssh://github.com/commaai/opendbc into secoc-…
jyoung8607 Aug 27, 2025
4196b97
whitespace adjustment for clarity
jyoung8607 Aug 27, 2025
8521e18
Merge branch 'master' into secoc-long
chrispypatt Sep 22, 2025
ff272b1
PR suggestions
chrispypatt Sep 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions opendbc/car/tests/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ class CarTestRoute(NamedTuple):
CarTestRoute("7e34a988419b5307/2019-12-18--19-13-30", TOYOTA.TOYOTA_RAV4_TSS2), # hybrid
CarTestRoute("2475fb3eb2ffcc2e/2022-04-29--12-46-23", TOYOTA.TOYOTA_RAV4_TSS2_2022), # hybrid
CarTestRoute("20ba9ade056a8c7b/2021-02-08--21-57-35", TOYOTA.TOYOTA_RAV4_PRIME), # SecOC
CarTestRoute("41ba5b181f29435d/00000001--e3ae76382f", TOYOTA.TOYOTA_RAV4_PRIME), # SecOC longitudinal
CarTestRoute("8bfb000e03b2a257/00000004--f9eee5f52e", TOYOTA.TOYOTA_SIENNA_4TH_GEN), # SecOC
CarTestRoute("0b54d0594d924cd9/00000057--b6206a3205", TOYOTA.TOYOTA_YARIS), # SecOC
CarTestRoute("7a31f030957b9c85/2023-04-01--14-12-51", TOYOTA.LEXUS_ES),
Expand Down
15 changes: 14 additions & 1 deletion opendbc/car/toyota/carcontroller.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ def __init__(self, dbc_names, CP):

self.secoc_lka_message_counter = 0
self.secoc_lta_message_counter = 0
self.secoc_acc_message_counter = 0
self.secoc_prev_reset_counter = 0

def update(self, CC, CS, now_nanos):
Expand All @@ -97,6 +98,7 @@ def update(self, CC, CS, now_nanos):
if CS.secoc_synchronization['RESET_CNT'] != self.secoc_prev_reset_counter:
self.secoc_lka_message_counter = 0
self.secoc_lta_message_counter = 0
self.secoc_acc_message_counter = 0
self.secoc_prev_reset_counter = CS.secoc_synchronization['RESET_CNT']

expected_mac = build_sync_mac(self.secoc_key, int(CS.secoc_synchronization['TRIP_CNT']), int(CS.secoc_synchronization['RESET_CNT']))
Expand Down Expand Up @@ -250,8 +252,19 @@ def update(self, CC, CS, now_nanos):

pcm_accel_cmd = float(np.clip(pcm_accel_cmd, self.params.ACCEL_MIN, self.params.ACCEL_MAX))

can_sends.append(toyotacan.create_accel_command(self.packer, pcm_accel_cmd, pcm_cancel_cmd, self.permit_braking, self.standstill_req, lead,
main_accel_cmd = 0. if self.CP.flags & ToyotaFlags.SECOC.value else pcm_accel_cmd
can_sends.append(toyotacan.create_accel_command(self.packer, main_accel_cmd, pcm_cancel_cmd, self.permit_braking, self.standstill_req, lead,
CS.acc_type, fcw_alert, self.distance_button))
if self.CP.flags & ToyotaFlags.SECOC.value:
acc_cmd_2 = toyotacan.create_accel_command_2(self.packer, pcm_accel_cmd)
acc_cmd_2 = add_mac(self.secoc_key,
int(CS.secoc_synchronization['TRIP_CNT']),
int(CS.secoc_synchronization['RESET_CNT']),
self.secoc_acc_message_counter,
acc_cmd_2)
self.secoc_acc_message_counter += 1
can_sends.append(acc_cmd_2)

self.accel = pcm_accel_cmd

else:
Expand Down
7 changes: 4 additions & 3 deletions opendbc/car/toyota/carstate.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from opendbc.car.common.filter_simple import FirstOrderFilter
from opendbc.car.interfaces import CarStateBase
from opendbc.car.toyota.values import ToyotaFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \
TSS2_CAR, RADAR_ACC_CAR, EPS_SCALE, UNSUPPORTED_DSU_CAR
TSS2_CAR, RADAR_ACC_CAR, EPS_SCALE, UNSUPPORTED_DSU_CAR, \
SECOC_CAR

ButtonType = structs.CarState.ButtonEvent.Type
SteerControlType = structs.CarParams.SteerControlType
Expand Down Expand Up @@ -190,14 +191,14 @@ def update(self, can_parsers) -> structs.CarState:
buttonEvents.extend(create_button_events(1, 0, {1: ButtonType.lkas}) +
create_button_events(0, 1, {1: ButtonType.lkas}))

if self.CP.carFingerprint not in RADAR_ACC_CAR:
if self.CP.carFingerprint not in (RADAR_ACC_CAR | SECOC_CAR):
# distance button is wired to the ACC module (camera or radar)
prev_distance_button = self.distance_button
self.distance_button = cp_acc.vl["ACC_CONTROL"]["DISTANCE"]

buttonEvents += create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
ret.buttonEvents = buttonEvents

ret.buttonEvents = buttonEvents
return ret

@staticmethod
Expand Down
9 changes: 3 additions & 6 deletions opendbc/car/toyota/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,12 +124,9 @@ def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_lo
# openpilot longitudinal behind experimental long toggle:
# - TSS2 radar ACC cars (disables radar)

if ret.flags & ToyotaFlags.SECOC.value:
ret.openpilotLongitudinalControl = False
else:
ret.openpilotLongitudinalControl = ret.enableDsu or \
candidate in (TSS2_CAR - RADAR_ACC_CAR) or \
bool(ret.flags & ToyotaFlags.DISABLE_RADAR.value)
ret.openpilotLongitudinalControl = ret.enableDsu or \
candidate in (TSS2_CAR - RADAR_ACC_CAR) or \
bool(ret.flags & ToyotaFlags.DISABLE_RADAR.value)

ret.autoResumeSng = ret.openpilotLongitudinalControl and candidate in NO_STOP_TIMER_CAR

Expand Down
7 changes: 7 additions & 0 deletions opendbc/car/toyota/toyotacan.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,13 @@ def create_accel_command(packer, accel, pcm_cancel, permit_braking, standstill_r
return packer.make_can_msg("ACC_CONTROL", 0, values)


def create_accel_command_2(packer, accel):
values = {
"ACCEL_CMD": accel,
}
return packer.make_can_msg("ACC_CONTROL_2", 0, values)


def create_pcs_commands(packer, accel, active, mass):
values1 = {
"COUNTER": 0,
Expand Down
34 changes: 29 additions & 5 deletions opendbc/safety/modes/toyota.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#define TOYOTA_COMMON_SECOC_TX_MSGS \
TOYOTA_BASE_TX_MSGS \
{0x2E4, 0, 8, .check_relay = true}, {0x131, 0, 8, .check_relay = true}, \
{0x343, 0, 8, .check_relay = false}, /* ACC cancel cmd */ \
{0x343, 0, 8, .check_relay = false}, /* ACC cancel cmd */ \

#define TOYOTA_COMMON_LONG_TX_MSGS \
TOYOTA_COMMON_TX_MSGS \
Expand All @@ -31,6 +31,11 @@
/* ACC */ \
{0x343, 0, 8, .check_relay = true}, \

#define TOYOTA_COMMON_SECOC_LONG_TX_MSGS \
TOYOTA_COMMON_SECOC_TX_MSGS \
{0x343, 0, 8, .check_relay = true}, \
{0x183, 0, 8, .check_relay = true}, /* ACC_CONTROL_2 */ \

#define TOYOTA_COMMON_RX_CHECKS(lta) \
{.msg = {{ 0xaa, 0, 8, 83U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
{.msg = {{0x260, 0, 8, 50U, .ignore_counter = true, .ignore_quality_flag=!(lta)}, { 0 }, { 0 }}}, \
Expand Down Expand Up @@ -208,6 +213,10 @@ static bool toyota_tx_hook(const CANPacket_t *msg) {
desired_accel = to_signed(desired_accel, 16);

bool violation = false;
if (toyota_secoc) {
// SecOC cars move accel to 0x183. Only allow inactive accel on 0x343 to match stock behavior
violation = desired_accel != TOYOTA_LONG_LIMITS.inactive_accel;
}
violation |= longitudinal_accel_checks(desired_accel, TOYOTA_LONG_LIMITS);

// only ACC messages that cancel are allowed when openpilot is not controlling longitudinal
Expand All @@ -226,6 +235,13 @@ static bool toyota_tx_hook(const CANPacket_t *msg) {
}
}

if (msg->addr == 0x183U) {
int desired_accel = (msg->data[0] << 8) | msg->data[1];
desired_accel = to_signed(desired_accel, 16);

tx = !longitudinal_accel_checks(desired_accel, TOYOTA_LONG_LIMITS);
}

// AEB: block all actuation. only used when DSU is unplugged
if (msg->addr == 0x283U) {
// only allow the checksum, which is the last byte
Expand Down Expand Up @@ -340,6 +356,10 @@ static safety_config toyota_init(uint16_t param) {
TOYOTA_COMMON_LONG_TX_MSGS
};

static const CanMsg TOYOTA_SECOC_LONG_TX_MSGS[] = {
TOYOTA_COMMON_SECOC_LONG_TX_MSGS
};

// safety param flags
// first byte is for EPS factor, second is for flags
const uint32_t TOYOTA_PARAM_OFFSET = 8U;
Expand All @@ -359,14 +379,18 @@ static safety_config toyota_init(uint16_t param) {
toyota_dbc_eps_torque_factor = param & TOYOTA_EPS_FACTOR;

safety_config ret;
if (toyota_stock_longitudinal) {
if (toyota_secoc) {
if (toyota_secoc) {
if (toyota_stock_longitudinal) {
SET_TX_MSGS(TOYOTA_SECOC_TX_MSGS, ret);
} else {
SET_TX_MSGS(TOYOTA_TX_MSGS, ret);
SET_TX_MSGS(TOYOTA_SECOC_LONG_TX_MSGS, ret);
}
} else {
SET_TX_MSGS(TOYOTA_LONG_TX_MSGS, ret);
if (toyota_stock_longitudinal) {
SET_TX_MSGS(TOYOTA_TX_MSGS, ret);
} else {
SET_TX_MSGS(TOYOTA_LONG_TX_MSGS, ret);
}
}

if (toyota_secoc) {
Expand Down
73 changes: 62 additions & 11 deletions opendbc/safety/tests/test_toyota.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from opendbc.safety.tests.common import CANPackerPanda

TOYOTA_COMMON_TX_MSGS = [[0x2E4, 0], [0x191, 0], [0x412, 0], [0x343, 0], [0x1D2, 0]] # LKAS + LTA + ACC & PCM cancel cmds
TOYOTA_SECOC_TX_MSGS = [[0x131, 0]] + TOYOTA_COMMON_TX_MSGS
TOYOTA_SECOC_TX_MSGS = [[0x131, 0], [0x183, 0]] + TOYOTA_COMMON_TX_MSGS
TOYOTA_COMMON_LONG_TX_MSGS = [[0x283, 0], [0x2E6, 0], [0x2E7, 0], [0x33E, 0], [0x344, 0], [0x365, 0], [0x366, 0], [0x4CB, 0], # DSU bus 0
[0x128, 1], [0x141, 1], [0x160, 1], [0x161, 1], [0x470, 1], # DSU bus 1
[0x411, 0], # PCS_HUD
Expand Down Expand Up @@ -52,10 +52,13 @@ def _lta_msg(self, req, req2, angle_cmd, torque_wind_down=100):
values = {"STEER_REQUEST": req, "STEER_REQUEST_2": req2, "STEER_ANGLE_CMD": angle_cmd, "TORQUE_WIND_DOWN": torque_wind_down}
return self.packer.make_can_msg_panda("STEERING_LTA", 0, values)

def _accel_msg(self, accel, cancel_req=0):
def _accel_msg_343(self, accel, cancel_req=0):
values = {"ACCEL_CMD": accel, "CANCEL_REQ": cancel_req}
return self.packer.make_can_msg_panda("ACC_CONTROL", 0, values)

def _accel_msg(self, accel, cancel_req=0):
return self._accel_msg_343(accel, cancel_req)

def _speed_msg(self, speed):
values = {("WHEEL_SPEED_%s" % n): speed * 3.6 for n in ["FR", "FL", "RR", "RL"]}
return self.packer.make_can_msg_panda("WHEEL_SPEEDS", 0, values)
Expand All @@ -73,12 +76,12 @@ def _pcm_status_msg(self, enable):
values = {"CRUISE_ACTIVE": enable}
return self.packer.make_can_msg_panda("PCM_CRUISE", 0, values)

def test_diagnostics(self, stock_longitudinal: bool = False):
def test_diagnostics(self, stock_longitudinal: bool = False, ecu_disabled: bool = True):
for should_tx, msg in ((False, b"\x6D\x02\x3E\x00\x00\x00\x00\x00"), # fwdCamera tester present
(False, b"\x0F\x03\xAA\xAA\x00\x00\x00\x00"), # non-tester present
(True, b"\x0F\x02\x3E\x00\x00\x00\x00\x00")):
tester_present = libsafety_py.make_CANPacket(0x750, 0, msg)
self.assertEqual(should_tx and not stock_longitudinal, self._tx(tester_present))
self.assertEqual(should_tx and ecu_disabled and not stock_longitudinal, self._tx(tester_present))

def test_block_aeb(self, stock_longitudinal: bool = False):
for controls_allowed in (True, False):
Expand Down Expand Up @@ -272,8 +275,8 @@ class TestToyotaStockLongitudinalBase(TestToyotaSafetyBase):

LONGITUDINAL = False

def test_diagnostics(self, stock_longitudinal: bool = True):
super().test_diagnostics(stock_longitudinal=stock_longitudinal)
def test_diagnostics(self, stock_longitudinal: bool = True, ecu_disabled: bool = True):
super().test_diagnostics(stock_longitudinal=stock_longitudinal, ecu_disabled=ecu_disabled)

def test_block_aeb(self, stock_longitudinal: bool = True):
super().test_block_aeb(stock_longitudinal=stock_longitudinal)
Expand All @@ -285,9 +288,9 @@ def test_acc_cancel(self):
for controls_allowed in [True, False]:
self.safety.set_controls_allowed(controls_allowed)
for accel in np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.1):
self.assertFalse(self._tx(self._accel_msg(accel)))
should_tx = np.isclose(accel, 0, atol=0.0001)
self.assertEqual(should_tx, self._tx(self._accel_msg(accel, cancel_req=1)))
self.assertFalse(self._tx(self._accel_msg_343(accel)))
should_tx = np.isclose(accel, self.INACTIVE_ACCEL, atol=0.0001)
self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel, cancel_req=1)))


class TestToyotaStockLongitudinalTorque(TestToyotaStockLongitudinalBase, TestToyotaSafetyTorque):
Expand All @@ -309,7 +312,7 @@ def setUp(self):
self.safety.init_tests()


class TestToyotaSecOcSafety(TestToyotaStockLongitudinalBase):
class TestToyotaSecOcSafetyBase(TestToyotaSafetyBase):

TX_MSGS = TOYOTA_SECOC_TX_MSGS
RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412, 0x131)}
Expand All @@ -319,9 +322,12 @@ def setUp(self):
self.packer = CANPackerPanda("toyota_secoc_pt_generated")
self.safety = libsafety_py.libsafety
self.safety.set_safety_hooks(CarParams.SafetyModel.toyota,
self.EPS_SCALE | ToyotaSafetyFlags.STOCK_LONGITUDINAL | ToyotaSafetyFlags.SECOC)
self.EPS_SCALE | ToyotaSafetyFlags.SECOC)
self.safety.init_tests()

def test_diagnostics(self, ecu_disabled: bool = False):
super().test_diagnostics(ecu_disabled=ecu_disabled)

# This platform also has alternate brake and PCM messages, but same naming in the DBC, so same packers work

def _user_gas_msg(self, gas):
Expand All @@ -342,6 +348,51 @@ def test_lta_2_steer_cmd(self):
should_tx = not req and not req2 and angle == 0
self.assertEqual(should_tx, self._tx(self._lta_2_msg(req, req2, angle)), f"{req=} {req2=} {angle=}")

def _accel_msg_183(self, accel):
values = {"ACCEL_CMD": accel}
return self.packer.make_can_msg_panda("ACC_CONTROL_2", 0, values)

def _accel_msg(self, accel, cancel_req=0):
return self._accel_msg_183(accel)


class TestToyotaSecOcSafetyStockLongitudinal(TestToyotaSecOcSafetyBase, TestToyotaStockLongitudinalBase):

def setUp(self):
self.packer = CANPackerPanda("toyota_secoc_pt_generated")
self.safety = libsafety_py.libsafety
self.safety.set_safety_hooks(CarParams.SafetyModel.toyota,
self.EPS_SCALE | ToyotaSafetyFlags.STOCK_LONGITUDINAL | ToyotaSafetyFlags.SECOC)
self.safety.init_tests()


class TestToyotaSecOcSafety(TestToyotaSecOcSafetyBase):

RELAY_MALFUNCTION_ADDRS = {0: (0x2E4, 0x191, 0x412, 0x131, 0x343, 0x183)}
FWD_BLACKLISTED_ADDRS = {2: [0x2E4, 0x191, 0x412, 0x131, 0x343, 0x183]}

def setUp(self):
self.packer = CANPackerPanda("toyota_secoc_pt_generated")
self.safety = libsafety_py.libsafety
self.safety.set_safety_hooks(CarParams.SafetyModel.toyota, self.EPS_SCALE | ToyotaSafetyFlags.SECOC)
self.safety.init_tests()

@unittest.skip("test not applicable for cars without a DSU")
def test_block_aeb(self, stock_longitudinal: bool = False):
pass

def test_343_actuation_blocked(self):
"""
For SecOC cars, longitudinal acceleration must be sent in ACC_CONTROL_2, but all other ACC
data remains in ACC_CONTROL. Verify no actuation is sent via ACC_CONTROL.
"""
for controls_allowed in [True, False]:
self.safety.set_controls_allowed(controls_allowed)
for accel in np.arange(self.MIN_ACCEL - 1, self.MAX_ACCEL + 1, 0.1):
should_tx = np.isclose(accel, self.INACTIVE_ACCEL, atol=0.0001)
self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel)))
self.assertEqual(should_tx, self._tx(self._accel_msg_343(accel, cancel_req=1)))


if __name__ == "__main__":
unittest.main()