From 4fa668d81aa915a7e5732aa42980b58e0dbe950b Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Fri, 16 Oct 2026 12:56:52 -0500 Subject: [PATCH] EV6 mismatch --- .../opendbc/car/hyundai/carcontroller.py | 8 +- openpilot/selfdrive/car/card.py | 28 ++- .../aol/tests/test_ev6_stock_parity.py | 214 ++++++++++++++++++ openpilot/starpilot/car/hyundai/aol.py | 3 + openpilot/starpilot/car/hyundai/ev6_intent.py | 19 ++ panda/board/obj/body_h7.bin.signed | Bin 210540 -> 210540 bytes panda/board/obj/bootstub.body_h7.bin | Bin 12040 -> 12040 bytes panda/board/obj/bootstub.panda.bin | Bin 11176 -> 11176 bytes .../obj/bootstub.panda_can_ignition_only.bin | Bin 11176 -> 11176 bytes panda/board/obj/bootstub.panda_h7.bin | Bin 18824 -> 18824 bytes .../bootstub.panda_h7_can_ignition_only.bin | Bin 18824 -> 18824 bytes .../obj/bootstub.panda_h7_hkg_remote.bin | Bin 18824 -> 18824 bytes ....panda_h7_hkg_remote_can_ignition_only.bin | Bin 18824 -> 18824 bytes panda/board/obj/bootstub.panda_h7_remote.bin | Bin 18824 -> 18824 bytes ...stub.panda_h7_remote_can_ignition_only.bin | Bin 18824 -> 18824 bytes .../obj/bootstub.panda_h7_tesla_wake.bin | Bin 18824 -> 18824 bytes ....panda_h7_tesla_wake_can_ignition_only.bin | Bin 18824 -> 18824 bytes panda/board/obj/bootstub.panda_hkg_remote.bin | Bin 11176 -> 11176 bytes ...tub.panda_hkg_remote_can_ignition_only.bin | Bin 11176 -> 11176 bytes panda/board/obj/bootstub.panda_remote.bin | Bin 11176 -> 11176 bytes ...ootstub.panda_remote_can_ignition_only.bin | Bin 11176 -> 11176 bytes panda/board/obj/bootstub.panda_tesla_wake.bin | Bin 11176 -> 11176 bytes ...tub.panda_tesla_wake_can_ignition_only.bin | Bin 11176 -> 11176 bytes panda/board/obj/gitversion.h | 2 +- panda/board/obj/panda.bin.signed | Bin 201952 -> 201952 bytes .../obj/panda_can_ignition_only.bin.signed | Bin 201928 -> 201928 bytes panda/board/obj/panda_h7.bin.signed | Bin 211268 -> 211268 bytes .../obj/panda_h7_can_ignition_only.bin.signed | Bin 211244 -> 211244 bytes .../board/obj/panda_h7_hkg_remote.bin.signed | Bin 211352 -> 211352 bytes ...h7_hkg_remote_can_ignition_only.bin.signed | Bin 211336 -> 211336 bytes panda/board/obj/panda_h7_remote.bin.signed | Bin 211268 -> 211268 bytes ...nda_h7_remote_can_ignition_only.bin.signed | Bin 211244 -> 211244 bytes .../board/obj/panda_h7_tesla_wake.bin.signed | Bin 211404 -> 211404 bytes ...h7_tesla_wake_can_ignition_only.bin.signed | Bin 211380 -> 211380 bytes panda/board/obj/panda_hkg_remote.bin.signed | Bin 202036 -> 202036 bytes ...da_hkg_remote_can_ignition_only.bin.signed | Bin 202020 -> 202020 bytes panda/board/obj/panda_remote.bin.signed | Bin 201948 -> 201948 bytes .../panda_remote_can_ignition_only.bin.signed | Bin 201924 -> 201924 bytes panda/board/obj/panda_tesla_wake.bin.signed | Bin 202084 -> 202084 bytes ...da_tesla_wake_can_ignition_only.bin.signed | Bin 202060 -> 202060 bytes panda/board/obj/version | 2 +- prebuilt.json | 2 +- 42 files changed, 267 insertions(+), 11 deletions(-) create mode 100644 openpilot/starpilot/aol/tests/test_ev6_stock_parity.py diff --git a/opendbc_repo/opendbc/car/hyundai/carcontroller.py b/opendbc_repo/opendbc/car/hyundai/carcontroller.py index 209ce31752..8230916a83 100644 --- a/opendbc_repo/opendbc/car/hyundai/carcontroller.py +++ b/opendbc_repo/opendbc/car/hyundai/carcontroller.py @@ -20,6 +20,8 @@ from opendbc.car.hyundai.hyundaicanfd import CanBus from opendbc.car.hyundai.ray_pedal import create_ray_pedal_command, ray_pedal_gas, ray_pedal_enabled from opendbc.car.hyundai.ioniq6_longitudinal import Ioniq6LongitudinalPolicy from opendbc.car.hyundai.canfd_dash_icons import CanFDDashIcons +from opendbc.car.hyundai.canfd_stock_aol import qualified as qualified_canfd_stock_aol +from opendbc.car.hyundai.ev6_aol import qualified as qualified_ev6_aol from opendbc.car.hyundai.g90_longitudinal import G90LongitudinalPolicy from opendbc.car.hyundai.gv70_longitudinal import is_gv70, scc_request, suppress_stock_cancel from opendbc.car.hyundai.g90_lead import G90LeadState, eligible as g90_lead_eligible @@ -135,7 +137,8 @@ class CarController(CarControllerBase): ioniq6_status = (self.ioniq6_longitudinal is not None and int(CP.safetyConfigs[-1].safetyParam) in (0x8015, 0x8095, 0x8815, 0x8895)) self.ioniq6_bsm_enabled = ioniq6_status - self.canfd_dash_icons = CanFDDashIcons() if ioniq6_status or self.torque_ev_scc_enabled else None + self.ev6_aol_status = CP.carFingerprint == CAR.KIA_EV6 and (qualified_canfd_stock_aol(CP) or qualified_ev6_aol(CP)) + self.canfd_dash_icons = CanFDDashIcons() if ioniq6_status or self.torque_ev_scc_enabled or self.ev6_aol_status else None self.ioniq6_bsm_counter = 0 self.ioniq6_bsm_last_can_ns = 0 self._ray_pedal = ray_pedal_enabled(CP) @@ -456,7 +459,8 @@ class CarController(CarControllerBase): ) else: steering_status_active = CC.enabled - if self.ioniq6_longitudinal is not None and self.CP.safetyConfigs[-1].safetyParam in (0x8815, 0x8895): + if self.ev6_aol_status or (self.ioniq6_longitudinal is not None and + self.CP.safetyConfigs[-1].safetyParam in (0x8815, 0x8895)): # AOL may steer while ordinary cruise engagement remains off. steering_status_active |= CC.latActive can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, diff --git a/openpilot/selfdrive/car/card.py b/openpilot/selfdrive/car/card.py index 9d074f1f89..f763674e15 100755 --- a/openpilot/selfdrive/car/card.py +++ b/openpilot/selfdrive/car/card.py @@ -1326,21 +1326,32 @@ class Car: self.CP.carFingerprint == GM_CAR.CHEVROLET_VOLT_ASCM and self.CP.pcmCruise and not self.CP.openpilotLongitudinalControl and gm_lane_centering_supported(self.CP))) + def ev6_startup_keepalive(self): + from opendbc.car.hyundai.ev6_startup import EV6Startup, required + from opendbc.car.hyundai.ecu_startup import Outcome + owner = getattr(getattr(self, 'vehicle_startup', None), 'owner', None) + return (isinstance(owner, EV6Startup) and owner.outcome is Outcome.SENT_UNCONFIRMED and + owner.ready and owner.published and owner.ci is self.CI and not owner.closed and + required(self.CP)) + def controls_update(self, CS: car.CarState, CC: car.CarControl, *, initialize_only=False): """control update loop, driven by carControl""" if initialize_only: + ev6_startup = self.ev6_startup_keepalive() now_ns = time.monotonic_ns() source_ns = int(self.sm.logMonoTime['carControl']) receipt_ns = int(self.sm.recv_time['carControl'] * 1e9) # Disabled torque/accel are commands; inactive curvature is only telemetry. - if (not self.aol_replay or not native_bootstrap_supported(self.CP) or self.vehicle_startup.owner is not None or + if (not (ev6_startup or (self.aol_replay and native_bootstrap_supported(self.CP) and self.vehicle_startup.owner is None)) or not CS.canValid or CS.canTimeout or not (self.sm.seen['carControl'] and self.sm.valid['carControl'] and self.sm.alive['carControl']) or not (0 < source_ns <= now_ns and now_ns - source_ns <= 150_000_000 and 0 < receipt_ns <= now_ns and now_ns - receipt_ns <= 150_000_000) or CC.enabled or CC.latActive or CC.longActive or CC.actuators.torque != 0.0 or CC.actuators.accel != 0.0): return + if ev6_startup and not self.vehicle_startup.owner.prepared_for(self.CP): + return if getattr(self, 'volt_cc_selected', False): if not self.volt_cc_control_current(): @@ -1407,11 +1418,16 @@ class Car: self.ci_initialized = True if initialize_only: - if (isinstance(self.CI, GMInterface) and self.volt_startup_keepalive() and + if ev6_startup and any(ps.faults for ps in self.sm['pandaStates']): + return + if (((isinstance(self.CI, GMInterface) and self.volt_startup_keepalive()) or ev6_startup) and self.startup_panda_configured(inactive_keepalive=True)): inactive = car.CarControl.new_message().as_reader() - self.last_actuators_output, can_sends = self.CI.apply( - inactive, time.clock_gettime_ns(time.CLOCK_BOOTTIME), startup_keepalive=True) + now_boot_ns = time.clock_gettime_ns(time.CLOCK_BOOTTIME) + if ev6_startup: + self.last_actuators_output, can_sends = self.CI.apply(inactive, now_boot_ns) + else: + self.last_actuators_output, can_sends = self.CI.apply(inactive, now_boot_ns, startup_keepalive=True) self.publish_sendcan(can_sends, valid=CS.canValid) return @@ -1484,9 +1500,9 @@ class Car: self.sm.seen['onroadEvents']) if not self.CP.passive and initialized: self.controls_update(CS, self.sm['carControl']) - elif ((not self.ci_initialized or self.volt_startup_keepalive()) and self.sm.seen['onroadEvents'] and + elif ((not self.ci_initialized or self.volt_startup_keepalive() or self.ev6_startup_keepalive()) and self.sm.seen['onroadEvents'] and any(e.name == EventName.selfdriveInitializing for e in self.sm['onroadEvents']) and - self.aol_replay and native_bootstrap_supported(self.CP)): + ((self.aol_replay and native_bootstrap_supported(self.CP)) or self.ev6_startup_keepalive())): self.controls_update(CS, self.sm['carControl'], initialize_only=True) radar_can = self._deferred_radar_can diff --git a/openpilot/starpilot/aol/tests/test_ev6_stock_parity.py b/openpilot/starpilot/aol/tests/test_ev6_stock_parity.py new file mode 100644 index 0000000000..497fd30c72 --- /dev/null +++ b/openpilot/starpilot/aol/tests/test_ev6_stock_parity.py @@ -0,0 +1,214 @@ +"""EV6 stock cruise retains separate steering intent and truthful dash status.""" +import os +from types import SimpleNamespace +from unittest.mock import patch + +import pytest +from opendbc.car import Bus, structs +from opendbc.car.hyundai.interface import CarInterface +from opendbc.car.hyundai.values import CAR, DBC +from opendbc.can import CANPacker, CANParser +from openpilot.cereal import messaging +from openpilot.common.params import Params +from openpilot.common.prefix import OpenpilotPrefix +from openpilot.selfdrive.car import card as card_module +from openpilot.starpilot.aol.intent import AOL_TOGGLE +from openpilot.starpilot.aol.tests import test_canfd_stock_profiles as stock +from openpilot.starpilot.tests import test_ev6_startup as startup + + +def packets(ci, tick, *, main=0, lkas=0): + result = [] + for parser in ci.can_parsers.values(): + packer = CANPacker(parser.dbc.name) + for address in sorted(parser.addresses): + name = parser.dbc.addr_to_msg[address].name + values = {} if name in ('FR_CMR_02_100ms', 'DOORS_SEATBELTS', 'BLINKERS') else {'COUNTER': tick % 16} + if name == ci.CS.cruise_btns_msg_canfd: + values.update(ADAPTIVE_CRUISE_MAIN_BTN=main, LDA_BTN=lkas) + elif name == 'SCC_CONTROL': + values.update(MainMode_ACC=1, ACCMode=0) + elif name == ci.CS.gear_msg_canfd: + values['GEAR'] = 5 + elif name == 'DOORS_SEATBELTS': + values['DRIVER_SEATBELT'] = 1 + result.append(packer.make_can_msg(name, parser.bus, values)) + return result + + +@pytest.mark.parametrize('main_action', [0, AOL_TOGGLE]) +def test_actual_card_stock_lkas_then_main_respects_saved_binding(main_action): + with OpenpilotPrefix(), patch.dict(os.environ, {'SIMULATION': '1', 'AOL_REPLAY_RUNTIME': '0'}): + saved = Params() + for key in ('AlwaysOnLateral', 'OpenpilotEnabledToggle'): + saved.put_bool(key, True, block=True) + saved.put('MainCruiseButtonControl', main_action, block=True) + saved.put('LKASButtonControl', AOL_TOGGLE, block=True) + cp = stock.params(CAR.KIA_EV6) + + def factory(*args, pre_create_hook, **kwargs): + selected = pre_create_hook(cp.as_reader().as_builder(), cp.carFingerprint, {}, []) + return CarInterface(selected) + + with patch.object(card_module.messaging, 'recv_one_retry', return_value=SimpleNamespace(can=[1])), \ + patch.object(card_module, 'get_car', side_effect=factory): + card = card_module.Car() + card.ci_initialized = True + card.publish_sendcan = lambda *args, **kwargs: None + card.CI.update([]) # Register lazy subscriptions before supplying the warmup batch. + try: + for tick, (main, lkas) in enumerate([(0, 0)] * 20 + [(0, 1), (0, 0), (1, 0), (0, 0)]): + now = 10_000_000_000 + tick * 10_000_000 + batch = messaging.log_from_bytes(card_module.can_list_to_can_capnp(packets(card.CI, tick, main=main, lkas=lkas))).as_builder() + batch.logMonoTime = now + with patch.object(card_module, 'REPLAY', False), \ + patch.object(card_module.messaging, 'drain_sock_raw', return_value=[batch.to_bytes()]), \ + patch.object(card_module.time, 'monotonic_ns', return_value=now), \ + patch.object(card_module.time, 'monotonic', return_value=now / 1e9), patch.object(card.sm, 'update'): + card.step() + assert card.CS_prev.canValid and not card.CS_prev.canTimeout + assert card.CS_prev.cruiseState.available + if tick == 21: + assert card.aol_card_intent.allowed_latch + assert card.aol_card_intent.allowed_latch == (main_action == 0) + assert not card.last_actuators_output.torqueOutputCan # No native permission was provided. + finally: + card.vehicle_startup.close() + + +@pytest.mark.parametrize('alpha', [False, True]) +def test_actual_controller_dash_follows_aol_without_changing_actuation(alpha): + if alpha: + ci, _, _ = startup.TestEV6Startup().exercise(mode='sent_restore') + ci.CP.alternativeExperience = 32 + else: + ci = CarInterface(stock.params(CAR.KIA_EV6)) + ci.CP.safetyConfigs[-1].safetyParam |= 0x800 + parser = CANParser(DBC[CAR.KIA_EV6][Bus.pt], [('LKAS', 0)], ci.CC.CAN.ACAN) + for tick in range(120): + now = 10_000_000_000 + tick * 10_000_000 + ci.update([(now, packets(ci, tick))]) + command = structs.CarControl(enabled=40 <= tick < 80, latActive=20 <= tick < 60) + _, frames = ci.apply(command.as_reader(), now) + steering = [frame for frame in frames if frame[0] == 0x50 and frame[2] == ci.CC.CAN.ACAN] + assert len(steering) == 1 + parser.update([(now, steering)]) + values = parser.vl['LKAS'] + assert values['LKA_SysIndReq'] == (2 if command.enabled or command.latActive else 1) + assert values['ActToiSta'] == command.latActive + assert values['StrTqReqVal'] == 0 + cluster = [frame for frame in frames if frame[0] == 0x1E0] + assert len(cluster) == int(alpha and tick % 5 == 0) + + +@pytest.mark.parametrize('variation', ['normal', 'aol_off', 'active', 'stale', 'native_mismatch', 'native_fault', 'invalid_can', 'changed_cp']) +def test_actual_card_replaces_disabled_adrv_during_selfdrive_initialization(variation): + from opendbc.car.hyundai.radar_interface import RadarInterface + from openpilot.starpilot.vehicle_startup import VehicleStartupOwner + + with OpenpilotPrefix(), patch.dict(os.environ, {'SIMULATION': '1', 'AOL_REPLAY_RUNTIME': '0'}): + saved = Params() + saved.put_bool('OpenpilotEnabledToggle', True, block=True) + saved.put_bool('AlwaysOnLateral', variation != 'aol_off', block=True) + # The fixture normally seals for its own assertions; Card owns the real seal here. + with patch.object(VehicleStartupOwner, 'seal_publication'): + ci, holder, _ = startup.TestEV6Startup().exercise(mode='sent_restore') + card = card_module.Car(CI=ci, RI=RadarInterface(ci.CP), startup_owner=holder.owner) + assert card.ev6_startup_keepalive() + holder.owner.published = False + assert not card.ev6_startup_keepalive() + holder.owner.published = True + holder.owner.ci = None + assert not card.ev6_startup_keepalive() + holder.owner.ci = ci + card.CI.update([]) + emitted = [] + card.publish_sendcan = lambda frames, valid=True: emitted.extend((card.sm.frame, frame, valid) for frame in frames) + try: + for tick in range(620): + now = 10_000_000_000 + tick * 10_000_000 + batch = messaging.log_from_bytes(card_module.can_list_to_can_capnp(packets(card.CI, tick))).as_builder() + batch.logMonoTime = now + control = messaging.new_message('carControl', valid=True, logMonoTime=now - (200_000_000 if variation == 'stale' else 0)) + if variation == 'active': + control.carControl.enabled = control.carControl.latActive = True + control.carControl.actuators.torque = .1 + events = messaging.new_message('onroadEvents', 1, valid=True, logMonoTime=now) + events.onroadEvents[0].name = 'selfdriveInitializing' + events.onroadEvents[0].noEntry = True + pandas = messaging.new_message('pandaStates', 1, valid=True, logMonoTime=now) + panda = pandas.pandaStates[0] + config = card.CP.safetyConfigs[0] + panda.safetyModel = config.safetyModel if tick >= 5 else 'elm327' + panda.safetyParam = (config.safetyParam ^ int(variation == 'native_mismatch')) if tick >= 5 else 1 + panda.alternativeExperience = card.CP.alternativeExperience if tick >= 5 else 0 + panda.ignitionLine = True + if variation == 'changed_cp': + card.CP.mass += 1 + if variation == 'native_fault': + panda.faults = ['relayMalfunction'] + card.sm.update_msgs(now / 1e9, [control.as_reader(), events.as_reader(), pandas.as_reader()]) + with patch.object(card_module, 'REPLAY', False), \ + patch.object(card_module.messaging, 'drain_sock_raw', return_value=[batch.to_bytes()]), \ + patch.object(card_module.time, 'monotonic_ns', return_value=now), \ + patch.object(card_module.time, 'monotonic', return_value=now / 1e9), \ + patch.object(card_module.time, 'clock_gettime_ns', return_value=now), patch.object(card.sm, 'update'): + if variation == 'invalid_can': + with patch.object(card.CI, 'update', wraps=card.CI.update) as parse: + def invalid(*args, **kwargs): + state = parse._mock_wraps(*args, **kwargs) + state.canValid = False + return state + parse.side_effect = invalid + card.step() + else: + card.step() + assert card.CS_prev.canValid == (variation != 'invalid_can') and not card.CS_prev.canTimeout + if variation not in ('normal', 'aol_off'): + assert not emitted + return + assert card.ci_initialized and saved.get_bool('ControlsReady') + assert emitted and all(valid for _, _, valid in emitted) + assert min(frame for frame, _, _ in emitted) <= 6 + scc = [(frame, msg) for frame, msg, _ in emitted if msg[0] == 0x1A0] + testers = [frame for frame, msg, _ in emitted if msg[0] == 0x730] + assert len(scc) >= 300 and len(testers) >= 6 + assert max(b - a for a, b in zip(testers, testers[1:], strict=False)) <= 100 + parser = CANParser(DBC[CAR.KIA_EV6][Bus.pt], [('SCC_CONTROL', 0)], card.CI.CC.CAN.ECAN) + for frame, msg in scc: + parser.update([(10_000_000_000 + frame * 10_000_000, [msg])]) + values = parser.vl['SCC_CONTROL'] + assert (values['ACCMode'], values['aReqRaw'], values['aReqValue'], values['StopReq']) == (0, 0., 0., 0) + assert card.last_actuators_output.torqueOutputCan == 0 + finally: + card.vehicle_startup.close() + + +def test_stock_held_main_rebinding_and_cancel_keep_physical_edges(): + from dataclasses import replace + from openpilot.starpilot.aol.intent import AolSettings + from openpilot.starpilot.car.hyundai.aol import create_intent + + owner = create_intent(stock.params(CAR.KIA_EV6), AolSettings(True, 0., AOL_TOGGLE, 0, (0, 0, 0), (0, 0, 0))) + cs = structs.CarState(canValid=True, gearShifter='drive') + cs.cruiseState.available = True + def update(events, now): + cs.buttonEvents = [structs.CarState.ButtonEvent(type=kind, pressed=pressed) for kind, pressed in events] + owner.update(cs, fault_active=False, now_ns=now) + update([], 1) + update([('lkas', True)], 2) + update([('lkas', False)], 3) + update([('mainCruise', True)], 4) + assert owner.allowed_latch + owner.settings = replace(owner.settings, main_action=AOL_TOGGLE) + update([('mainCruise', True)], 5) + assert owner.allowed_latch # A new mapping cannot turn an already held level into another press. + update([('mainCruise', False)], 6) + update([('mainCruise', True)], 7) + assert not owner.allowed_latch + owner.settings = replace(owner.settings, main_action=0) + update([('mainCruise', False)], 8) + update([('lkas', True)], 9) + assert owner.allowed_latch + update([('cancel', True)], 10) + assert not owner.allowed_latch diff --git a/openpilot/starpilot/car/hyundai/aol.py b/openpilot/starpilot/car/hyundai/aol.py index 4ab050e5ee..3fd6b01727 100644 --- a/openpilot/starpilot/car/hyundai/aol.py +++ b/openpilot/starpilot/car/hyundai/aol.py @@ -257,6 +257,9 @@ def native_latch_rejected(CP, native) -> bool: def create_intent(CP, settings): from opendbc.car.hyundai.ev6_aol import qualified as ev6_qualified + if CP.carFingerprint == HyundaiCAR.KIA_EV6 and qualified_canfd_stock(CP): + from openpilot.starpilot.car.hyundai.ev6_intent import StockEv6CardIntent + return StockEv6CardIntent(settings) if ev6_qualified(CP): from openpilot.starpilot.car.hyundai.ev6_intent import Ev6CardIntent return Ev6CardIntent(settings) diff --git a/openpilot/starpilot/car/hyundai/ev6_intent.py b/openpilot/starpilot/car/hyundai/ev6_intent.py index 39abd6a282..a0e484a85f 100644 --- a/openpilot/starpilot/car/hyundai/ev6_intent.py +++ b/openpilot/starpilot/car/hyundai/ev6_intent.py @@ -4,6 +4,25 @@ from opendbc.car.hyundai.ev6_aol import Ev6PhysicalAuthorization from openpilot.starpilot.aol.intent import AolCardIntent, AOL_TOGGLE, ButtonType +class StockEv6CardIntent(AolCardIntent): + def __init__(self, settings): + super().__init__(settings, explicit_latch=True) + + def update(self, CS, *, consumed_buttons=frozenset(), fault_active=None, now_ns=0, native_rejection_ns=0, + standard_enabled=False): + if self.settings.main_action == 0 and self.settings.lkas_action == AOL_TOGGLE: + # An unassigned cruise MAIN owns stock ACC, not the separate LKAS latch. + for event in CS.buttonEvents: + if event.type == ButtonType.mainCruise: + self._main_held = bool(event.pressed) + ordinary = CS.as_reader().as_builder() + ordinary.buttonEvents = [event for event in CS.buttonEvents if event.type != ButtonType.mainCruise] + else: + ordinary = CS + super().update(ordinary, consumed_buttons=consumed_buttons, fault_active=fault_active, now_ns=now_ns, + native_rejection_ns=native_rejection_ns, standard_enabled=standard_enabled) + + class Ev6CardIntent(AolCardIntent): observe_stock_engagement = True diff --git a/panda/board/obj/body_h7.bin.signed b/panda/board/obj/body_h7.bin.signed index 94fb0f550f5c1bd0220bdad41109570ce72567d3..ad545924d43ee5f63ed6aca045861d3cfab729a1 100644 GIT binary patch delta 160 zcmV;R0AK&?> OnlR+D8q(UCIRTUrSVL<7 delta 160 zcmV;R0AK&?>_B%|UppsMi@9oBQFS@W zzf^FpujkF6Ws)5!P%*-E(})i8-JEE+rQ7|;6 OA=0%AxFbgrF#*UTgH1~S diff --git a/panda/board/obj/bootstub.body_h7.bin b/panda/board/obj/bootstub.body_h7.bin index 56fb6ccd36e99f3b71a553df9151013e699caf54..0677c0fb0148be081617efafa8586951a4192d57 100755 GIT binary patch delta 21 ccmeB(>xkQsti@qrX<}@UXl}4MTWc;008kAE%K!iX delta 21 ccmeB(>xkQsti@rOl4@yUkZQR(TWc;0091(wH~;_u diff --git a/panda/board/obj/bootstub.panda.bin b/panda/board/obj/bootstub.panda.bin index b3a14dc2796df1cd493320c975bbe8e1dcd22cb5..5879dd4e7a157a15de1015110b0882f0db3986f0 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}u#OA}**M0119JJsH^003Hd2jc($ delta 21 dcmZ1xz9M|XMl}x0lvGO-gH+4SJJsH^003U|2v7h3 diff --git a/panda/board/obj/bootstub.panda_can_ignition_only.bin b/panda/board/obj/bootstub.panda_can_ignition_only.bin index b3a14dc2796df1cd493320c975bbe8e1dcd22cb5..5879dd4e7a157a15de1015110b0882f0db3986f0 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}u#OA}**M0119JJsH^003Hd2jc($ delta 21 dcmZ1xz9M|XMl}x0lvGO-gH+4SJJsH^003U|2v7h3 diff --git a/panda/board/obj/bootstub.panda_h7.bin b/panda/board/obj/bootstub.panda_h7.bin index 31d0f19b650f5e1d233f3d406216055c44f7cde4..37e3930fc838c4515872b8f4e19e80860b4f0f7f 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4hu^YV}nFkFx>*WHbms delta 23 fcmeB}%-AuRal=k$4$G8OOA~`s%gqO!kFx>*Xs`&a diff --git a/panda/board/obj/bootstub.panda_h7_can_ignition_only.bin b/panda/board/obj/bootstub.panda_h7_can_ignition_only.bin index 31d0f19b650f5e1d233f3d406216055c44f7cde4..37e3930fc838c4515872b8f4e19e80860b4f0f7f 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4hu^YV}nFkFx>*WHbms delta 23 fcmeB}%-AuRal=k$4$G8OOA~`s%gqO!kFx>*Xs`&a diff --git a/panda/board/obj/bootstub.panda_h7_hkg_remote.bin b/panda/board/obj/bootstub.panda_h7_hkg_remote.bin index 31d0f19b650f5e1d233f3d406216055c44f7cde4..37e3930fc838c4515872b8f4e19e80860b4f0f7f 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4hu^YV}nFkFx>*WHbms delta 23 fcmeB}%-AuRal=k$4$G8OOA~`s%gqO!kFx>*Xs`&a diff --git a/panda/board/obj/bootstub.panda_h7_hkg_remote_can_ignition_only.bin b/panda/board/obj/bootstub.panda_h7_hkg_remote_can_ignition_only.bin index 31d0f19b650f5e1d233f3d406216055c44f7cde4..37e3930fc838c4515872b8f4e19e80860b4f0f7f 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4hu^YV}nFkFx>*WHbms delta 23 fcmeB}%-AuRal=k$4$G8OOA~`s%gqO!kFx>*Xs`&a diff --git a/panda/board/obj/bootstub.panda_h7_remote.bin b/panda/board/obj/bootstub.panda_h7_remote.bin index 31d0f19b650f5e1d233f3d406216055c44f7cde4..37e3930fc838c4515872b8f4e19e80860b4f0f7f 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4hu^YV}nFkFx>*WHbms delta 23 fcmeB}%-AuRal=k$4$G8OOA~`s%gqO!kFx>*Xs`&a diff --git a/panda/board/obj/bootstub.panda_h7_remote_can_ignition_only.bin b/panda/board/obj/bootstub.panda_h7_remote_can_ignition_only.bin index 31d0f19b650f5e1d233f3d406216055c44f7cde4..37e3930fc838c4515872b8f4e19e80860b4f0f7f 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4hu^YV}nFkFx>*WHbms delta 23 fcmeB}%-AuRal=k$4$G8OOA~`s%gqO!kFx>*Xs`&a diff --git a/panda/board/obj/bootstub.panda_h7_tesla_wake.bin b/panda/board/obj/bootstub.panda_h7_tesla_wake.bin index 31d0f19b650f5e1d233f3d406216055c44f7cde4..37e3930fc838c4515872b8f4e19e80860b4f0f7f 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4hu^YV}nFkFx>*WHbms delta 23 fcmeB}%-AuRal=k$4$G8OOA~`s%gqO!kFx>*Xs`&a diff --git a/panda/board/obj/bootstub.panda_h7_tesla_wake_can_ignition_only.bin b/panda/board/obj/bootstub.panda_h7_tesla_wake_can_ignition_only.bin index 31d0f19b650f5e1d233f3d406216055c44f7cde4..37e3930fc838c4515872b8f4e19e80860b4f0f7f 100755 GIT binary patch delta 23 fcmeB}%-AuRal=k$4hu^YV}nFkFx>*WHbms delta 23 fcmeB}%-AuRal=k$4$G8OOA~`s%gqO!kFx>*Xs`&a diff --git a/panda/board/obj/bootstub.panda_hkg_remote.bin b/panda/board/obj/bootstub.panda_hkg_remote.bin index b3a14dc2796df1cd493320c975bbe8e1dcd22cb5..5879dd4e7a157a15de1015110b0882f0db3986f0 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}u#OA}**M0119JJsH^003Hd2jc($ delta 21 dcmZ1xz9M|XMl}x0lvGO-gH+4SJJsH^003U|2v7h3 diff --git a/panda/board/obj/bootstub.panda_hkg_remote_can_ignition_only.bin b/panda/board/obj/bootstub.panda_hkg_remote_can_ignition_only.bin index b3a14dc2796df1cd493320c975bbe8e1dcd22cb5..5879dd4e7a157a15de1015110b0882f0db3986f0 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}u#OA}**M0119JJsH^003Hd2jc($ delta 21 dcmZ1xz9M|XMl}x0lvGO-gH+4SJJsH^003U|2v7h3 diff --git a/panda/board/obj/bootstub.panda_remote.bin b/panda/board/obj/bootstub.panda_remote.bin index b3a14dc2796df1cd493320c975bbe8e1dcd22cb5..5879dd4e7a157a15de1015110b0882f0db3986f0 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}u#OA}**M0119JJsH^003Hd2jc($ delta 21 dcmZ1xz9M|XMl}x0lvGO-gH+4SJJsH^003U|2v7h3 diff --git a/panda/board/obj/bootstub.panda_remote_can_ignition_only.bin b/panda/board/obj/bootstub.panda_remote_can_ignition_only.bin index b3a14dc2796df1cd493320c975bbe8e1dcd22cb5..5879dd4e7a157a15de1015110b0882f0db3986f0 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}u#OA}**M0119JJsH^003Hd2jc($ delta 21 dcmZ1xz9M|XMl}x0lvGO-gH+4SJJsH^003U|2v7h3 diff --git a/panda/board/obj/bootstub.panda_tesla_wake.bin b/panda/board/obj/bootstub.panda_tesla_wake.bin index b3a14dc2796df1cd493320c975bbe8e1dcd22cb5..5879dd4e7a157a15de1015110b0882f0db3986f0 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}u#OA}**M0119JJsH^003Hd2jc($ delta 21 dcmZ1xz9M|XMl}x0lvGO-gH+4SJJsH^003U|2v7h3 diff --git a/panda/board/obj/bootstub.panda_tesla_wake_can_ignition_only.bin b/panda/board/obj/bootstub.panda_tesla_wake_can_ignition_only.bin index b3a14dc2796df1cd493320c975bbe8e1dcd22cb5..5879dd4e7a157a15de1015110b0882f0db3986f0 100755 GIT binary patch delta 21 dcmZ1xz9M|XMl}u#OA}**M0119JJsH^003Hd2jc($ delta 21 dcmZ1xz9M|XMl}x0lvGO-gH+4SJJsH^003U|2v7h3 diff --git a/panda/board/obj/gitversion.h b/panda/board/obj/gitversion.h index b0534984cc..5ffeaaf528 100644 --- a/panda/board/obj/gitversion.h +++ b/panda/board/obj/gitversion.h @@ -1,4 +1,4 @@ #pragma once extern const uint8_t gitversion[29]; -const uint8_t gitversion[29] = "DEV-9de940e9-P92eb5651-DEBUG"; +const uint8_t gitversion[29] = "DEV-89430a70-P92eb5651-DEBUG"; diff --git a/panda/board/obj/panda.bin.signed b/panda/board/obj/panda.bin.signed index cdc3f579dd8043e2da966bc5560500b46f166f16..0e686e473aaa302d9fb3fe528513670e851113ad 100644 GIT binary patch delta 160 zcmV;R0AK&$sSMz$41lx&EcXaFIW#jcVK*>`H1`3wH1`559e*LGt&{htZywv3Il#fc z7L-k%!cy)jibwNyFQM{u=b`9QOgY9QOh&9e}$H z9?p*Da)3FgLF}Fo66#u!VtuSvgr1+zYNX(r*k@AMDl6n?4iZ_+RkFeofO^K#1_Jp4 zX0}d}I5oI|@%0w`R+w8a22Z!Fegx9W-qol#{u;&Z%c{* delta 160 zcmV;R0AK&esSL=e41lx&6!!=@WMw%tFl9N19QOgY9QOh&9e-cfu<#IV?_syrD}(xP zxh53Bu0hKdALgO4Ozm${6s;x>%IaW-&m)?$jVAhg&L}pmcOG$uCsk17H8a&W>^_J^4pcoFN4T> zy;IX|cY3CBs=^daGrO!y4x-K^mUV*JrI#3*IQM49JRBY0(5^9GD9Vf^{k<2)6prA7 Q&+l||L^FlJU>E8Ew8;uf+yDRo delta 162 zcmV;T0A2sY@(jfC41k0Iv;s&P2svbBIW#b3Ifqah0=G~a19TpLnXay^8h%t~Xt=ck z_Hk8JruPPSQgHp~VM;i%UZZ29@5i7}whMewLcJR&o}r~ekzJX%o|^F!3h|NSJ?5*~ zX(UZ-*F0VX2sA#GRVx}(RX~-i`kOQYea+-gSEV=HEyItQRbvfi2UlN&TRj7f>Ya5Q Q`YC#!px>4+qwCuNU{?f4WdHyG diff --git a/panda/board/obj/panda_h7_can_ignition_only.bin.signed b/panda/board/obj/panda_h7_can_ignition_only.bin.signed index 6aa71cbcd3c26d770dcdeeeb4c6f198fcde4d51b..fe1547a2dd42a087ab4791a6f6d939f1c46020ec 100644 GIT binary patch delta 162 zcmV;T0A2sA@(ir<41k0Iv;r_12sk-3GcaK{Fo!rA0=GCC19TpLHp4JOo)v#ixVJm) z_H~PtF3NZ+oE5z|I>i6Z^Q5D1fFX|RZUiv&c6>0DDc7%3xfkURvFPDU0dD95nx=(u zGZ5?{a?J>53T3duiqym}D0sHjb;ao`F?q^|FxRcgb2yf7V)j-!Q|n?gt?iMB&Zu)r Q{NkmIgwPkWI^{e8kXBJk^Z)<= delta 162 zcmV;T0A2sA@(ir<41k0Iv;r_12svbBIW#b3IfpnJ0=GCC19TpLb-vOO&xqgIyJ2@* z?6-2Em!T57gG-PBqmSm??AKkCri29Pi!fmBiDO$)aWXQU93ts$Uf$}AP>PTWPq0G0vMWUw{xSWH9|f7#Bxp94-*|!cs55ni5#0i@r*f; QvSI~8yy1Q3El{Wd8NUoj1ONa4 diff --git a/panda/board/obj/panda_h7_hkg_remote.bin.signed b/panda/board/obj/panda_h7_hkg_remote.bin.signed index 55f062922c9a390a7a8c98d247ada4c477985f2d..318c0b9c340ff855aaf4ef2f5300b6b5a4eb4750 100644 GIT binary patch delta 162 zcmV;T0A2r>^9-2t41k0Iv;v$O2sk-3GcaK{Fo&cX0=J|Z19TpLU7dy8xC#ELIn5=r z3gAEtGBcP6MBarhv(N5FA09P3ACvco?pmhJmr-^cC}(>^_)v-^9-2t41k0Iv;v$O2svbBIW#b3IftYg0=J|Z19TpLKCpH0=JYJ19TpLwNgz*B9-yq7AwJ* znDknd=_&%P)#4zqIYLG#DPMp}5y$Cis~2u}I`YtXY+n%s5&Hbz!r*I={g5#lcU8(8 z6fLnXi`MG-Qr2DC_G(ABtybO0Ry&$YrTUm^bb!#1OpHW*VU~)#$2*Y){7v6)q9~MC QGP(-K(8(7)sqb9@*q|CrMF0Q* delta 162 zcmV;T0A2rx^9+dd41k0Iv;vG82svbBIW#b3Ifs-Q0=JYJ19TpLWm}1&wNZq)^7E=?)|7%+ z+aq{p*}@3DEW?`LR_6ut;k&DzC<%`wFxStT36SJ<%*e_q0{dEgT1-@T1zVLl<`*X! z=2|JXa1I!Zb}T*ol1+igOsU+FC9jtAxtFh;A|xb>T>wwAg@w4LlCC QFm82IJw8a`!BqzV%v1MB#sB~S delta 162 zcmV;T0A2sA@(ir<41k0Iv;r_12svbBIW#b3IfpnJ0=GCC19TpLkKYCjYX0VOjraTT z=ls39a`Z$ed6>X8icTv?T!LPgd`4>GynD?A5>Vqe0Xt`Bg#&|W6qbF@SHNq_qNCLk z*h*cp7!uva&{qnsg3rcrPkTX#a7b*I){lhheiz}X29IPPH*J!84a>?o`J(q5=>V~z QPoV$c(W2^=V8?O+TMPV5`~Uy| diff --git a/panda/board/obj/panda_h7_tesla_wake.bin.signed b/panda/board/obj/panda_h7_tesla_wake.bin.signed index 9a2618175bc20929dde13ffa9a330e85e23f383a..03be0d11681564f3c40316760931817a1da16eda 100644 GIT binary patch delta 162 zcmV;T0A2sg^9;=M41k0Iv;xc;2sk-3GcaK{Fo)C{0=Lu}19%>PuyDwJ^l)hd=Kh}Z zZ@DjfcjNLxynq6@F*Ntf>oEtRWd#@M+k@V;d_FLWgG2YOr8=CKgx^`Y7ABeVuRu_5 zgWL)NZH=)Lm@CepE!pd1t0Tc~ju@#0eWk7#d=yqF?jez}#}ULI*B3`!%A~RPc}po4{QXcog1}6W zn_?0}r8v_eHRtNipAR0V5WtgGcz6|lGbe>qIK~G?Z>WQl0Q)14#4B)lIXDa5Y~3hP zkd65mJ%rM)>XMqcmb%+s1;<#6!4Y(wY*>w2{n-W`*nE1DJl!+RhfRW+DWMi>-C@RJ QaIh~!;HUNtC=urY=VBR2fdBvi diff --git a/panda/board/obj/panda_h7_tesla_wake_can_ignition_only.bin.signed b/panda/board/obj/panda_h7_tesla_wake_can_ignition_only.bin.signed index 3bd83d5205f54182524d627fbeca7416fffc6901..c58413630f64c43f966302e38018cab0d74c50d6 100644 GIT binary patch delta 162 zcmV;T0A2sI^9;1}41k0Iv;wpm2sk-3GcaK{Fo(Pv0=K*x19%>PlSWQZqu9X02lzZj z#vLJ}l^kC~nmdksw^`Q7+3ZxDwWcLL5sfBY##y3a46)&_YQu^!MgSb+tlKS QDW9%jq;}A+aGVkW@bNB9lmGw# delta 162 zcmV;T0A2sI^9;1}41k0Iv;wpm2svbBIW#b3IfuL&0=K*x19%>PSR${_g>U$zX$1fg zUPXo+DDI{xM>Tk7~KMZQV+uc)cj~m{Qv*} diff --git a/panda/board/obj/panda_hkg_remote.bin.signed b/panda/board/obj/panda_hkg_remote.bin.signed index 5607efaccd286c1c600665d25d1ba12ab010e883..922be0bd78c7cc36a31a11a9f6229c2cd3706ec8 100644 GIT binary patch delta 160 zcmV;R0AK&KstmNM41lx&fcFSEIW#jcVK*>`i1z`vi1z|49e)Ldxa=724d&8hpPQfU zUczAELR@`1&jp2$wB6jp#^n9a{-eD;kdxJL0~lif?aDYaaw(kPZ@tRLkr`#~B#CLs z)XZz9oSPVVaBC_~FEIesdYFBhflrjY3ROmdh@(FXu;s#`E5m@(nEo^c*nX|#ykoZI Oq|-pSpRrqq3IS-+sZhND delta 160 zcmV;R0AK&KstmNM41lx&fcFSFWMw%tFl9N1i1z`vi1z|49e+ypRBdHai6oD&ekjB9 zIMy<8oz!t(ZQrQiv)nF7wqDYor|1l#5(YIhnb^`c=rLfc=rM<9e<&yhfIoFvi_Q-Y~g@b zzTZcC?NiN=>P{*205*($9=BW3g%?trbpV-MI+TobMdyHm(k7P$5&56sh=hB;sIXPk z52uikSFMT^AIV=lSWrA}B<$cbBUV3to8vBia8U^C7jjYDGRi-+-3s0htcz~1t2A$N OjLp3E<|TTn%>mS4dQ5fz delta 160 zcmV;R0AK&4stly641lx&aQ6r~WMw%tFl9N1c=rLfc=rM<9e;rXVGLVhv@yK&8+Q{*E#Dj6%50&E9}-~1S?-SX;|=^|TT)X(X8)o;Pf OKo1*N6wKp;7y);4vP_Hs diff --git a/panda/board/obj/panda_remote.bin.signed b/panda/board/obj/panda_remote.bin.signed index 1f88f11f042133acd038838087f50f480da6c62b..2ab090fad4dbbca6fb8f7bf6a79cd1c0c8ea449e 100644 GIT binary patch delta 160 zcmV;R0AK&ysSMny41lx&DEA0BIW#jcVK*>`F!uqsF!us19e;(G<~X0i3x*|S6g*An z$ihI`AXXRu`=*Q~Z5~t`Cz_mw9P4Y9zO8INuj95|pCsrz0+5!L6O0A4;i}CacZWT( zdG{x|OuV;4L-?$E$TcEXzJ~7vC?UXkubvvYaLqYHAI{*CPjg|G8uH^N9xF_`k|3g= ON!alj+pxM7xB+>94N5@( delta 160 zcmV;R0AK&ysSMny41lx&DEA0CWMw%tFl9N1F!uqsF!us19e<~3=6F>f0+q)L+`&Y` z$c{@|7)s-(jXbzJtW{Fg3`x3+)_^Tl8#|SEWqI(>JI28uGgbLh@bdD%`8216U8217!9e*Eq6*}juN~CLM2s~)P zJiW3A#gtIx_EbALD?i!+b6noVP9G`aiU2;(5y3Mg@5W4r1CSKlak@JCw;gd)!TvV) zy9v?O-^DlzB>f`^$)vHJ>T<$wdgYska4M1KYyXl~E6I}rG}lyJ1XY2hnq++iNe<@2 OYh6x|pRBNy4FM*>lSn22 delta 160 zcmV;R0AK&asSL!a41lx&5cdcNc=-@14R zud(Fr1kSBZ1wj{_62hDfMC-sH=u21mnE5OKjc;URvMMR#7Myli3gqefSm0a>=Re;%{$hj0M@u6#d^GcN0Ft+ OGc|z9*!OMT5CK!%SWZU( diff --git a/panda/board/obj/panda_tesla_wake.bin.signed b/panda/board/obj/panda_tesla_wake.bin.signed index 1116fce8e2f3b388ed67edee50d7ccdfaab957c1..0fb52be1f34b49a9ca18869fa4a9ed60ee7924f8 100644 GIT binary patch delta 160 zcmV;R0AK&)stn|+41lx&toH~wIW#jcVK*>`wD$qGwD$rq9e=TlRS~?BCRuz}>z|EZ z*XKG2Y&V-AR9O1d8AIIH7_v`{Ddo$+=Pk&`>!1lM;8Qe^TBiq5^1i0Gg}%@vOv|>r z;A7Dv)hc0KPUasZmQkmUXXq{Q2p|GM?q_mQVAZM)S-9#n?G|-)@DVIyXJCy1=^^#C O5F=gtRG5CowgDIP2TVl( delta 160 zcmV;R0AK&)stn|+41lx&toH~xWMw%tFl9N1wD$qGwD$rq9eKI`yaVo+QfVp9lb7_L5K5nPK;CUNL# Od+kT9GDrS`oc95@oc97S9e+l#{DDmY#R72cFK?Eo zYoF1MgRlBOe%jyT@AW=(Qkq#?FGHNstH8Y?c z(})5q(cB@LoSSy1kZvF@B6BDN=S!l-T@AkMv7dy>4U!yM?m$|ElJoJwu+I{e)CLo{ O{iE-$fb&uVi~)TN2ulF~ delta 160 zcmV;R0AK&istnAk41lx&l=lcZWMw%tFl9N1oc95@oc97S9e=9cXVG$hN%B4iiIcJZ zAK2M(;z8Sg9GFJ0ZCI5x6dq-8k_Bcp%xjsX-?FPN**(?|fI2?Za4AR%W