Nissan: Parse cruise control buttons (#341)

* Nissan: Parse cruise control buttons

* Remove cancel and resumeCruise buttons

Removed cancel and resumeCruise buttons from BUTTONS list.

* Apply suggestions from code review

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>

* restore gapAdjustCruise button event handling in Nissan CarState

---------

Co-authored-by: Jason Wen <haibin.wen3@gmail.com>
This commit is contained in:
downquark7
2026-02-04 14:53:13 -06:00
committed by GitHub
parent e956d6d7dd
commit 167d06d408
3 changed files with 57 additions and 3 deletions

View File

@@ -5,15 +5,17 @@ from opendbc.car import Bus, create_button_events, structs
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.interfaces import CarStateBase
from opendbc.car.nissan.values import CAR, DBC, CarControllerParams
from opendbc.sunnypilot.car.nissan.carstate_ext import CarStateExt
ButtonType = structs.CarState.ButtonEvent.Type
TORQUE_SAMPLES = 12
class CarState(CarStateBase):
class CarState(CarStateBase, CarStateExt):
def __init__(self, CP, CP_SP):
super().__init__(CP, CP_SP)
CarStateBase.__init__(self, CP, CP_SP)
CarStateExt.__init__(self, CP, CP_SP)
can_define = CANDefine(DBC[CP.carFingerprint][Bus.pt])
self.lkas_hud_msg = {}
@@ -127,7 +129,12 @@ class CarState(CarStateBase):
self.lkas_hud_msg = copy.copy(cp_adas.vl["PROPILOT_HUD"])
self.lkas_hud_info_msg = copy.copy(cp_adas.vl["PROPILOT_HUD_INFO_MSG"])
ret.buttonEvents = create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise})
CarStateExt.update(self, ret, ret_sp, can_parsers)
ret.buttonEvents = [
*create_button_events(self.distance_button, prev_distance_button, {1: ButtonType.gapAdjustCruise}),
*self.button_events,
]
return ret, ret_sp

View File

@@ -0,0 +1,34 @@
"""
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
This file is part of sunnypilot and is licensed under the MIT License.
See the LICENSE.md file in the root directory for more details.
"""
from enum import StrEnum
from opendbc.car import Bus, structs
from opendbc.can.parser import CANParser
from opendbc.sunnypilot.car.nissan.values import BUTTONS
class CarStateExt:
def __init__(self, CP, CP_SP):
self.CP = CP
self.CP_SP = CP_SP
self.button_events = []
self.button_states = {button.event_type: False for button in BUTTONS}
def update(self, ret: structs.CarState, ret_sp: structs.CarStateSP, can_parsers: dict[StrEnum, CANParser]):
cp = can_parsers[Bus.pt]
button_events = []
for button in BUTTONS:
state = (cp.vl[button.can_addr][button.can_msg] in button.values)
if self.button_states[button.event_type] != state:
event = structs.CarState.ButtonEvent.new_message()
event.type = button.event_type
event.pressed = state
button_events.append(event)
self.button_states[button.event_type] = state
self.button_events = button_events

View File

@@ -5,7 +5,20 @@ This file is part of sunnypilot and is licensed under the MIT License.
See the LICENSE.md file in the root directory for more details.
"""
from collections import namedtuple
from opendbc.car import structs
class NissanSafetyFlagsSP:
DEFAULT = 0
LEAF = 1
ButtonType = structs.CarState.ButtonEvent.Type
Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values'])
BUTTONS = [
Button(ButtonType.accelCruise, "CRUISE_THROTTLE", "RES_BUTTON", [1]),
Button(ButtonType.decelCruise, "CRUISE_THROTTLE", "SET_BUTTON", [1]),
]