Files
StarPilot/openpilot/starpilot/aol/tests/test_kona_aol.py
T
firestar5683 a82935f326 User interfaces and Android Auto
Integrate onroad views, configurable widgets, local settings, steering-profile contracts, Bluetooth and Android Auto with their device and runtime services.

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
Co-authored-by: Daniel Koepping <elkoled@gmail.com>
Co-authored-by: Danny <dannyirwin31@yahoo.com>
Co-authored-by: DimitriChrysafis <Dimitri.chrysafis@gmail.com>
Co-authored-by: Dom <168790843+firestar5683@users.noreply.github.com>
Co-authored-by: Harald Schäfer <harald.the.engineer@gmail.com>
Co-authored-by: Prabhaav Pillai <prabhaav@msu.edu>
Co-authored-by: Shane Smiskol <shane@smiskol.com>
Co-authored-by: dirwin31 <83434411+dirwin31@users.noreply.github.com>
Co-authored-by: firestarsdog <229254897+firestarsdog@users.noreply.github.com>
Co-authored-by: stef <19478336+stefpi@users.noreply.github.com>
Co-authored-by: whoisdomi <dcantu83@gmail.com>

Co-authored-by: Intelli <contact@intelli.software>
Co-authored-by: pharmacomaniac <blittle65@gmail.com>

Co-authored-by: prabhaavp <prabhaav@msu.edu>
2026-10-14 20:02:39 -05:00

110 lines
5.8 KiB
Python

"""Exact main-only Kona AOL identity, intent and actual Controls onset."""
import os
import unittest
from unittest.mock import patch
from opendbc.car import gen_empty_fingerprint, structs
from opendbc.car.hyundai.interface import CarInterface
from opendbc.car.hyundai.values import CAR, HyundaiFlags
from opendbc.car.hyundai.kona_aol import qualified, allow_lateral_onset, KONA_AOL_WORD
from openpilot.starpilot.aol.intent import AolSettings
from openpilot.starpilot.car.hyundai.aol import policy_for, create_intent, native_accepts_cp
def params(car=CAR.HYUNDAI_KONA_NON_SCC):
return CarInterface.get_params(car, gen_empty_fingerprint(), [], False, False, False)
class TestKonaAol(unittest.TestCase):
def test_exact_stock_factory_and_named_independent_profile(self):
cp = params()
self.assertTrue(qualified(cp))
self.assertEqual(cp.safetyConfigs[0].safetyParam, 0x1040)
self.assertFalse(cp.openpilotLongitudinalControl)
self.assertTrue(cp.pcmCruise)
policy = policy_for(cp)
self.assertTrue(policy.settings_supported and policy.runtime_supported)
cp.safetyConfigs[0].safetyParam |= policy.safety_param_addition
cp.alternativeExperience |= policy.alternative_experience_addition
self.assertEqual(cp.safetyConfigs[0].safetyParam, KONA_AOL_WORD)
self.assertTrue(native_accepts_cp(cp, int(cp.safetyConfigs[0].safetyModel.raw), KONA_AOL_WORD))
for flag in (HyundaiFlags.HAS_LDA_BUTTON, HyundaiFlags.EV, HyundaiFlags.HYBRID, HyundaiFlags.CANFD):
bad = cp.as_reader().as_builder()
bad.flags |= int(flag)
self.assertFalse(qualified(bad))
for car in (CAR.HYUNDAI_KONA_EV_NON_SCC, CAR.KIA_FORTE_2019_NON_SCC, CAR.HYUNDAI_KONA):
self.assertFalse(qualified(params(car)))
def test_actual_main_intent_fault_requires_off_on_and_no_lkas_expansion(self):
owner = create_intent(params(), AolSettings(True, 0., 0, 0, (0, 0, 0), (0, 0, 0)))
cs = structs.CarState(canValid=True, gearShifter='drive')
cs.cruiseState.available = True
owner.update(cs, fault_active=False, now_ns=1)
self.assertTrue(owner.allowed_latch)
owner.update(cs, fault_active=True, now_ns=2)
self.assertFalse(owner.allowed_latch)
owner.update(cs, fault_active=False, now_ns=3)
self.assertFalse(owner.allowed_latch)
cs.cruiseState.available = False
owner.update(cs, fault_active=False, now_ns=4)
cs.cruiseState.available = True
owner.update(cs, fault_active=False, now_ns=5)
self.assertTrue(owner.allowed_latch)
self.assertFalse(owner.has_lkas)
def test_actual_controls_native_permission_and_driver_release_retry(self):
from openpilot.cereal import messaging
from openpilot.common.params import Params
from openpilot.common.prefix import OpenpilotPrefix
from openpilot.selfdrive.controls.controlsd import Controls
from openpilot.starpilot.aol.wire import SAFETY_SERVICE, SafetyState, encode_safety
from openpilot.starpilot.lateral.tests.test_lane_runtime import feed
cp = params()
policy = policy_for(cp)
cp.safetyConfigs[0].safetyParam |= policy.safety_param_addition
cp.alternativeExperience |= policy.alternative_experience_addition
with OpenpilotPrefix(), patch.dict(os.environ, {'REPLAY':'1','AOL_REPLAY_RUNTIME':'1'}), \
patch('openpilot.selfdrive.controls.controlsd.messaging.PubMaster'):
Params().put_bool('AlwaysOnLateral', True)
Params().put('CarParams', cp.to_bytes(), block=True)
controls = Controls()
self.assertTrue(controls.aol_replay)
# held onset -> release -> ongoing grip -> loss -> held retry -> normal.
cases = ((False,True,True,False), (False,False,True,True), (False,True,True,True),
(False,False,False,False), (False,True,True,False), (True,True,True,True))
for tick,(enabled,pressed,allowed,expected) in enumerate(cases):
now = 1_000_000_000 + tick*10_000_000
feed(controls, now, tick, active=enabled, enabled=enabled, fault=False)
cs = messaging.new_message('carState',valid=True,logMonoTime=now)
cs.carState = controls.sm['carState']
cs.carState.gearShifter = 'drive'
cs.carState.steeringPressed = pressed
cs.carState.canValid = True
cs.carState.cruiseState.available = True
controls.sm.data['carState'] = cs.carState.as_reader()
axis = messaging.new_message('aolAxisState',valid=True,logMonoTime=now)
axis.aolAxisState.qualified = True
axis.aolAxisState.sessionId = 'kona-session'
axis.aolAxisState.observedMonoTime = now
axis.aolAxisState.validUntilMonoTime = now+30_000_000
axis.aolAxisState.desiredLateral = True
axis.aolAxisState.lateralActive = allowed
axis.aolAxisState.nativeAcknowledged = allowed
wire = messaging.new_message(SAFETY_SERVICE,0,valid=True,logMonoTime=now)
wire.aolSafetyWire = encode_safety(SafetyState(protocolVersion=1,compatible=True,observedMonoTime=now,
validUntilMonoTime=now+200_000_000,safetyModel=int(cp.safetyConfigs[0].safetyModel.raw),
safetyParam=KONA_AOL_WORD,lateralAllowed=allowed,longitudinalAllowed=False,
requestedLateral=True,requestedLongitudinal=False,pandaSerial='panda',axisSessionId='kona-session'))
controls.sm.update_msgs(now/1e9,[axis.as_reader(),wire.as_reader()])
command,_ = controls.state_control()
self.assertEqual(command.latActive,expected)
self.assertEqual(command.enabled,enabled)
self.assertFalse(command.longActive)
self.assertEqual(controls.aol_previous_lateral_active,expected)
def test_no_permission_cannot_be_created_by_onset_guard(self):
for enabled in (False,True):
for pressed in (False,True):
for previous in (False,True):
self.assertFalse(allow_lateral_onset(permitted=False,normal_enabled=enabled,
steering_pressed=pressed,previous_active=previous))