mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-15 14:22:11 +08:00
aol
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user