This commit is contained in:
firestar5683
2026-07-14 17:57:12 -05:00
parent acd15fcba7
commit 77db3e506c
6 changed files with 51 additions and 62 deletions
@@ -199,7 +199,6 @@ void hyundai_common_acc_main_on_sync(void) {
if (acc_main_on_mismatches >= 3U) {
acc_main_on = false;
lkas_on = false;
}
} else {
acc_main_on_mismatches = 0U;
+7 -4
View File
@@ -4,6 +4,12 @@
static bool nissan_alt_eps = false;
static void nissan_rx_all_hook(const CANPacket_t *msg) {
if ((msg->addr == 0x1B6U) && (msg->bus == (nissan_alt_eps ? 2U : 1U))) {
acc_main_on = GET_BIT(msg, 36U);
}
}
static void nissan_rx_hook(const CANPacket_t *msg) {
if (msg->bus == (nissan_alt_eps ? 1U : 0U)) {
@@ -51,10 +57,6 @@ static void nissan_rx_hook(const CANPacket_t *msg) {
pcm_cruise_check(cruise_engaged);
}
if ((msg->addr == 0x1B6U) && (msg->bus == (nissan_alt_eps ? 2U : 1U))) {
acc_main_on = GET_BIT(msg, 36U);
}
if ((msg->addr == 0x239U) && (msg->bus == 0U)) {
acc_main_on = GET_BIT(msg, 17U);
}
@@ -140,6 +142,7 @@ static safety_config nissan_init(uint16_t param) {
const safety_hooks nissan_hooks = {
.init = nissan_init,
.rx_all = nissan_rx_all_hook,
.rx = nissan_rx_hook,
.tx = nissan_tx_hook,
};
@@ -208,6 +208,28 @@ class HyundaiLongitudinalBase(common.LongitudinalAccelSafetyTest):
class HyundaiAolLkasOnEngageBase:
def test_acc_main_sync_does_not_clear_aol_lkas_latch(self):
try:
tx_acc_state_msg = self._tx_acc_state_msg(False)
except NotImplementedError as err:
raise unittest.SkipTest("ACC main TX state message not implemented") from err
self.safety.set_alternative_experience(ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL)
self._rx(self._button_msg(Buttons.NONE, main_button=0))
self._rx(self._button_msg(Buttons.NONE, main_button=1))
self._rx(self._button_msg(Buttons.NONE, main_button=0))
self._rx(self._button_msg(Buttons.SET))
self._rx(self._button_msg(Buttons.NONE))
self.safety.set_controls_allowed(False)
for _ in range(3):
self._tx(tx_acc_state_msg)
self.assertFalse(self.safety.get_acc_main_on())
self._set_prev_torque(0)
self.assertTrue(self._tx(self._torque_cmd_msg(self.MAX_RATE_UP)))
def test_aol_lkas_auto_enables_on_set_engagement(self):
torque_cmd = self.MAX_RATE_UP
@@ -3,6 +3,7 @@ import unittest
from opendbc.car.nissan.values import NissanSafetyFlags
from opendbc.car.structs import CarParams
from opendbc.safety import ALTERNATIVE_EXPERIENCE
from opendbc.safety.tests.libsafety import libsafety_py
import opendbc.safety.tests.common as common
from opendbc.safety.tests.common import CANPackerSafety
@@ -17,6 +18,7 @@ class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest):
EPS_BUS = 0
CRUISE_BUS = 2
PRO_PILOT_BUS = 1
# Angle control limits
STEER_ANGLE_MAX = 600 # deg, reasonable limit
@@ -82,7 +84,21 @@ class TestNissanSafety(common.CarSafetyTest, common.AngleSteeringSafetyTest):
def _toggle_aol(self, toggle_on):
# PRO_PILOT, CRUISE_ON is the main on button for X-Trail/Rogue/Altima
values = {"CRUISE_ON": 1 if toggle_on else 0}
return self.packer.make_can_msg_panda("PRO_PILOT", 2, values)
return self.packer.make_can_msg_panda("PRO_PILOT", self.PRO_PILOT_BUS, values)
def test_aol_remains_allowed_after_cruise_cancel(self):
self.safety.set_alternative_experience(ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL)
self._rx(self._toggle_aol(True))
self._rx(self._pcm_status_msg(True))
self.assertTrue(self.safety.get_controls_allowed())
self._rx(self._pcm_status_msg(False))
self.assertFalse(self.safety.get_controls_allowed())
self._reset_angle_measurement(0)
self._reset_speed_measurement(1)
self._set_prev_desired_angle(0)
self.assertTrue(self._tx(self._angle_cmd_msg(angle=self.ANGLE_RATE_UP[0] / 2.0, enabled=True)))
class TestNissanSafetyAltEpsBus(TestNissanSafety):
@@ -90,6 +106,7 @@ class TestNissanSafetyAltEpsBus(TestNissanSafety):
EPS_BUS = 1
CRUISE_BUS = 1
PRO_PILOT_BUS = 2
def setUp(self):
self.packer = CANPackerSafety("nissan_x_trail_2017_generated")
-12
View File
@@ -40,10 +40,6 @@ class StarPilotCard:
self.hyundai_preserve_aol_across_reverse = getattr(self.CP, "carFingerprint", None) == HYUNDAI_CAR.HYUNDAI_SONATA_HYBRID
self.hyundai_aol_needs_engagement = self.CP.brand == "hyundai" and not (hyundai_flags & HyundaiFlags.CANFD) and not kia_forte_non_scc
self.hyundai_aol_ready = False
# Nissan's angle-control EPS can fault if AOL starts while the wheel is at a
# large parking angle. Require one normal openpilot engagement before AOL.
self.nissan_aol_needs_engagement = self.CP.brand == "nissan"
self.nissan_aol_ready = False
self.prev_active = False
self.prev_cruise_enabled = False
self.decel_pressed = False
@@ -130,13 +126,6 @@ class StarPilotCard:
elif sm["selfdriveState"].active or carState.cruiseState.enabled:
self.hyundai_aol_ready = True
if self.nissan_aol_needs_engagement:
if carState.gearShifter in NON_DRIVING_GEARS:
self.nissan_aol_ready = False
self.always_on_lateral_allowed = False
elif sm["selfdriveState"].active:
self.nissan_aol_ready = True
if button_aol_supported:
for be, be_type in zip(carState.buttonEvents, button_event_types, strict=False):
if be_type == ButtonType.lkas and be.pressed and starpilot_toggles.always_on_lateral_lkas:
@@ -178,7 +167,6 @@ class StarPilotCard:
self.always_on_lateral_enabled = self.always_on_lateral_allowed and self.always_on_lateral_set
self.always_on_lateral_enabled &= carState.gearShifter not in NON_DRIVING_GEARS
self.always_on_lateral_enabled &= not self.hyundai_aol_needs_engagement or self.hyundai_aol_ready
self.always_on_lateral_enabled &= not self.nissan_aol_needs_engagement or self.nissan_aol_ready
self.always_on_lateral_enabled &= sm["starpilotPlan"].lateralCheck
self.always_on_lateral_enabled &= sm["liveCalibration"].calPerc >= 1
alert_types = sm["selfdriveState"].alertType + sm["starpilotSelfdriveState"].alertType
@@ -215,7 +215,7 @@ def test_hyundai_aol_does_not_auto_start_from_cruise_availability(monkeypatch, t
assert ret.alwaysOnLateralEnabled is False
def test_nissan_aol_requires_normal_engagement(monkeypatch, tmp_path):
def test_nissan_main_aol_can_start_before_normal_engagement(monkeypatch, tmp_path):
monkeypatch.setattr(spc, "Params", FakeParams)
monkeypatch.setattr(spc, "is_FrogsGoMoo", lambda: False)
monkeypatch.setattr(spc, "ERROR_LOGS_PATH", tmp_path)
@@ -224,53 +224,13 @@ def test_nissan_aol_requires_normal_engagement(monkeypatch, tmp_path):
SimpleNamespace(brand="nissan"),
SimpleNamespace(alternativeExperience=spc.ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL),
)
assert card.nissan_aol_needs_engagement is True
assert card.nissan_aol_ready is False
starpilot_car_state = SimpleNamespace(distancePressed=False)
sm = make_sm()
toggles = make_toggles(always_on_lateral=True, main_cruise_aol_toggle=True, lkas_allowed_for_aol=True)
car_state = make_car_state(available=True, button_events=[SimpleNamespace(type=spc.ButtonType.mainCruise, pressed=True)])
ret = card.update(car_state, starpilot_car_state, sm, toggles)
ret = card.update(make_car_state(available=True), SimpleNamespace(distancePressed=False), make_sm(),
make_toggles(always_on_lateral=True, always_on_lateral_main=True))
assert ret.alwaysOnLateralAllowed is True
assert ret.alwaysOnLateralEnabled is False
sm["selfdriveState"].active = True
ret = card.update(make_car_state(available=True, enabled=True), starpilot_car_state, sm, toggles)
assert ret.alwaysOnLateralEnabled is True
sm["selfdriveState"].active = False
ret = card.update(make_car_state(available=True), starpilot_car_state, sm, toggles)
assert ret.alwaysOnLateralEnabled is True
def test_nissan_aol_engagement_latch_resets_out_of_drive(monkeypatch, tmp_path):
monkeypatch.setattr(spc, "Params", FakeParams)
monkeypatch.setattr(spc, "is_FrogsGoMoo", lambda: False)
monkeypatch.setattr(spc, "ERROR_LOGS_PATH", tmp_path)
card = spc.StarPilotCard(
SimpleNamespace(brand="nissan"),
SimpleNamespace(alternativeExperience=spc.ALTERNATIVE_EXPERIENCE.ALWAYS_ON_LATERAL),
)
starpilot_car_state = SimpleNamespace(distancePressed=False)
sm = make_sm()
sm["selfdriveState"].active = True
toggles = make_toggles(always_on_lateral=True, always_on_lateral_main=True)
ret = card.update(make_car_state(available=True, enabled=True), starpilot_car_state, sm, toggles)
assert ret.alwaysOnLateralEnabled is True
sm["selfdriveState"].active = False
park_state = make_car_state(available=True)
park_state.gearShifter = spc.GearShifter.park
ret = card.update(park_state, starpilot_car_state, sm, toggles)
assert ret.alwaysOnLateralEnabled is False
assert card.nissan_aol_ready is False
ret = card.update(make_car_state(available=True), starpilot_car_state, sm, toggles)
assert ret.alwaysOnLateralEnabled is False
def test_hyundai_canfd_lkas_button_can_toggle_aol_before_engagement(monkeypatch, tmp_path):
monkeypatch.setattr(spc, "Params", FakeParams)