Skip to content

Commit

Permalink
Move safety constants to opendbc (commaai#2145)
Browse files Browse the repository at this point in the history
* move to opendbc

* all passing

* do the rest

* fix

* and another

* order

* and update ref to master
  • Loading branch information
sshane authored and elkoled committed Feb 18, 2025
1 parent 0fceb8e commit 396465c
Show file tree
Hide file tree
Showing 48 changed files with 182 additions and 194 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ RUN pip3 install --break-system-packages --no-cache-dir $PYTHONPATH/panda/[dev]

# TODO: this should be a "pip install" or not even in this repo at all
RUN git config --global --add safe.directory $PYTHONPATH/panda
ENV OPENDBC_REF="0eab9bf26e1b36678db4f198986091c82e538967"
ENV OPENDBC_REF="950e7b34efa64d2ad41df3300652661fbae06f57"
RUN cd /tmp/ && \
git clone --depth 1 https://github.com/sunnypilot/opendbc opendbc_repo && \
cd opendbc_repo && git fetch origin $OPENDBC_REF && git checkout FETCH_HEAD && rm -rf .git/ && \
Expand Down
2 changes: 1 addition & 1 deletion __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from .python.utils import logger # noqa: F401
from .python import (Panda, PandaDFU, isotp, # noqa: F401
pack_can_buffer, unpack_can_buffer, calculate_checksum,
DLC_TO_LEN, LEN_TO_DLC, ALTERNATIVE_EXPERIENCE, CANPACKET_HEAD_SIZE)
DLC_TO_LEN, LEN_TO_DLC, CANPACKET_HEAD_SIZE)


# panda jungle
Expand Down
5 changes: 3 additions & 2 deletions board/jungle/scripts/loopback_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import random
from termcolor import cprint

from opendbc.safety import Safety
from panda import Panda, PandaJungle

NUM_PANDAS_PER_TEST = 1
Expand Down Expand Up @@ -88,7 +89,7 @@ def can_loopback(sender):
def test_loopback():
# disable safety modes
for panda in pandas:
panda.set_safety_mode(Panda.SAFETY_ELM327 if FOR_RELEASE_BUILDS else Panda.SAFETY_ALLOUTPUT)
panda.set_safety_mode(Safety.SAFETY_ELM327 if FOR_RELEASE_BUILDS else Safety.SAFETY_ALLOUTPUT)

# perform loopback with jungle as a sender
can_loopback(jungle)
Expand All @@ -99,7 +100,7 @@ def test_loopback():

# enable safety modes
for panda in pandas:
panda.set_safety_mode(Panda.SAFETY_SILENT)
panda.set_safety_mode(Safety.SAFETY_SILENT)

#################################################################
############################# MAIN ##############################
Expand Down
3 changes: 2 additions & 1 deletion board/jungle/scripts/spam_can.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/env python3
import os
import random
from opendbc.safety import Safety
from panda import PandaJungle

def get_test_string():
Expand All @@ -9,7 +10,7 @@ def get_test_string():
if __name__ == "__main__":
p = PandaJungle()

p.set_safety_mode(PandaJungle.SAFETY_ALLOUTPUT)
p.set_safety_mode(Safety.SAFETY_ALLOUTPUT)

print("Spamming all buses...")
while True:
Expand Down
5 changes: 3 additions & 2 deletions examples/query_fw_versions.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#!/usr/bin/env python3
import argparse
from tqdm import tqdm
from panda import Panda
from opendbc.car.carlog import carlog
from opendbc.car.uds import UdsClient, MessageTimeoutError, NegativeResponseError, InvalidSubAddressError, \
SESSION_TYPE, DATA_IDENTIFIER_TYPE
from opendbc.safety import Safety
from panda import Panda

if __name__ == "__main__":
parser = argparse.ArgumentParser()
Expand Down Expand Up @@ -63,7 +64,7 @@
exit()

panda = Panda(serial=args.serial)
panda.set_safety_mode(Panda.SAFETY_ELM327, 1 if args.no_obd else 0)
panda.set_safety_mode(Safety.SAFETY_ELM327, 1 if args.no_obd else 0)
print("querying addresses ...")
with tqdm(addrs) as t:
for addr in t:
Expand Down
3 changes: 2 additions & 1 deletion examples/query_vin_and_stats.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/env python3
import time
import struct
from opendbc.safety import Safety
from panda import Panda
from hexdump import hexdump
from panda.python.isotp import isotp_send, isotp_recv
Expand Down Expand Up @@ -30,7 +31,7 @@ def get_supported_pids():

if __name__ == "__main__":
panda = Panda()
panda.set_safety_mode(Panda.SAFETY_ELM327)
panda.set_safety_mode(Safety.SAFETY_ELM327)
panda.can_clear(0)

# 09 02 = Get VIN
Expand Down
5 changes: 3 additions & 2 deletions examples/tesla_tester.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#!/usr/bin/env python3

import binascii
from opendbc.safety import Safety
from panda import Panda

def tesla_tester():
Expand All @@ -13,7 +14,7 @@ def tesla_tester():
# Now set the panda from its default of SAFETY_SILENT (read only) to SAFETY_ALLOUTPUT
# Careful, as this will let us send any CAN messages we want (which could be very bad!)
print("Setting Panda to output mode...")
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
p.set_safety_mode(Safety.SAFETY_ALLOUTPUT)

# BDY 0x248 is the MCU_commands message, which includes folding mirrors, opening the trunk, frunk, setting the cars lock state and more.
# For our test, we will edit the 3rd byte, which is MCU_lockRequest. 0x01 will lock, 0x02 will unlock:
Expand All @@ -26,7 +27,7 @@ def tesla_tester():

#Back to safety...
print("Disabling output on Panda...")
p.set_safety_mode(Panda.SAFETY_SILENT)
p.set_safety_mode(Safety.SAFETY_SILENT)

print("Reading VIN from 0x568. This is painfully slow and can take up to 3 minutes (1 minute per message; 3 messages needed for full VIN)...")

Expand Down
44 changes: 3 additions & 41 deletions python/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
from functools import wraps, partial
from itertools import accumulate

from opendbc.safety import Safety

from .base import BaseHandle
from .constants import FW_PATH, McuType
from .dfu import PandaDFU
Expand Down Expand Up @@ -101,48 +103,8 @@ def wrapper(self, *args, **kwargs):



class ALTERNATIVE_EXPERIENCE:
DEFAULT = 0
DISABLE_DISENGAGE_ON_GAS = 1
DISABLE_STOCK_AEB = 2
RAISE_LONGITUDINAL_LIMITS_TO_ISO_MAX = 8
ALLOW_AEB = 16

# sunnypilot
ENABLE_MADS = 2 ** 10
DISENGAGE_LATERAL_ON_BRAKE = 2 ** 11

class Panda:

# matches cereal.car.CarParams.SafetyModel
SAFETY_SILENT = 0
SAFETY_HONDA_NIDEC = 1
SAFETY_TOYOTA = 2
SAFETY_ELM327 = 3
SAFETY_GM = 4
SAFETY_HONDA_BOSCH_GIRAFFE = 5
SAFETY_FORD = 6
SAFETY_HYUNDAI = 8
SAFETY_CHRYSLER = 9
SAFETY_TESLA = 10
SAFETY_SUBARU = 11
SAFETY_MAZDA = 13
SAFETY_NISSAN = 14
SAFETY_VOLKSWAGEN_MQB = 15
SAFETY_ALLOUTPUT = 17
SAFETY_GM_ASCM = 18
SAFETY_NOOUTPUT = 19
SAFETY_HONDA_BOSCH = 20
SAFETY_VOLKSWAGEN_PQ = 21
SAFETY_SUBARU_PREGLOBAL = 22
SAFETY_HYUNDAI_LEGACY = 23
SAFETY_HYUNDAI_COMMUNITY = 24
SAFETY_STELLANTIS = 25
SAFETY_FAW = 26
SAFETY_BODY = 27
SAFETY_HYUNDAI_CANFD = 28
SAFETY_PSA = 31

SERIAL_DEBUG = 0
SERIAL_ESP = 1
SERIAL_LIN1 = 2
Expand Down Expand Up @@ -752,7 +714,7 @@ def get_interrupt_call_rate(self, irqnum):
def set_power_save(self, power_save_enabled=0):
self._handle.controlWrite(Panda.REQUEST_OUT, 0xe7, int(power_save_enabled), 0, b'')

def set_safety_mode(self, mode=SAFETY_SILENT, param=0):
def set_safety_mode(self, mode=Safety.SAFETY_SILENT, param=0):
self._handle.controlWrite(Panda.REQUEST_OUT, 0xdc, mode, param, b'')

def set_obd(self, obd):
Expand Down
9 changes: 5 additions & 4 deletions tests/black_white_loopback_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import time
import random
import argparse
from opendbc.safety import Safety
from panda import Panda

def get_test_string():
Expand Down Expand Up @@ -47,8 +48,8 @@ def run_test(sleep_duration):
raise Exception("Connect white/grey and black panda to run this test!")

# disable safety modes
black_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
other_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
black_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
other_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)

# test health packet
print("black panda health", black_panda.health())
Expand All @@ -62,9 +63,9 @@ def run_test(sleep_duration):
print("Number of cycles:", counter, "Non-zero bus errors:", nonzero_bus_errors, "Zero bus errors:", zero_bus_errors, "Content errors:", content_errors)

# Toggle relay
black_panda.set_safety_mode(Panda.SAFETY_SILENT)
black_panda.set_safety_mode(Safety.SAFETY_SILENT)
time.sleep(1)
black_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
black_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
time.sleep(1)


Expand Down
9 changes: 5 additions & 4 deletions tests/black_white_relay_endurance.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import random
import argparse

from opendbc.safety import Safety
from panda import Panda

def get_test_string():
Expand Down Expand Up @@ -48,8 +49,8 @@ def run_test(sleep_duration):
raise Exception("Connect white/grey and black panda to run this test!")

# disable safety modes
black_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
other_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
black_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
other_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)

# test health packet
print("black panda health", black_panda.health())
Expand All @@ -69,9 +70,9 @@ def run_test(sleep_duration):

if (time.time() - temp_start_time) > 3600 * 6:
# Toggle relay
black_panda.set_safety_mode(Panda.SAFETY_SILENT)
black_panda.set_safety_mode(Safety.SAFETY_SILENT)
time.sleep(1)
black_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
black_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
time.sleep(1)
temp_start_time = time.time()

Expand Down
9 changes: 5 additions & 4 deletions tests/black_white_relay_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import random
import argparse

from opendbc.safety import Safety
from panda import Panda

def get_test_string():
Expand Down Expand Up @@ -50,8 +51,8 @@ def run_test(sleep_duration):
raise Exception("Connect white/grey and black panda to run this test!")

# disable safety modes
black_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
other_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
black_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
other_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)

# test health packet
print("black panda health", black_panda.health())
Expand All @@ -60,15 +61,15 @@ def run_test(sleep_duration):
# test black -> other
while True:
# Switch on relay
black_panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
black_panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
time.sleep(0.05)

if not test_buses(black_panda, other_panda, (0, False, [0])):
open_errors += 1
raise Exception("Open error")

# Switch off relay
black_panda.set_safety_mode(Panda.SAFETY_SILENT)
black_panda.set_safety_mode(Safety.SAFETY_SILENT)
time.sleep(0.05)

if not test_buses(black_panda, other_panda, (0, False, [0, 2])):
Expand Down
5 changes: 3 additions & 2 deletions tests/bulk_write_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import threading
from typing import Any

from opendbc.safety import Safety
from panda import Panda

JUNGLE = "JUNGLE" in os.environ
Expand All @@ -30,9 +31,9 @@ def flood_tx(panda):
raise Exception("Connect two pandas to perform this test!")
sender = Panda(serials[0])
receiver = Panda(serials[1]) # type: ignore
receiver.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
receiver.set_safety_mode(Safety.SAFETY_ALLOUTPUT)

sender.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
sender.set_safety_mode(Safety.SAFETY_ALLOUTPUT)

# Start transmisson
threading.Thread(target=flood_tx, args=(sender,)).start()
Expand Down
3 changes: 2 additions & 1 deletion tests/can_printer.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from collections import defaultdict
import binascii

from opendbc.safety import Safety
from panda import Panda

# fake
Expand All @@ -16,7 +17,7 @@ def can_printer():
time.sleep(1)

p.can_clear(0xFFFF)
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
p.set_safety_mode(Safety.SAFETY_ALLOUTPUT)

start = sec_since_boot()
lp = sec_since_boot()
Expand Down
7 changes: 4 additions & 3 deletions tests/canfd/test_canfd.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import time
import random
from collections import defaultdict
from opendbc.safety import Safety
from panda import Panda, calculate_checksum, DLC_TO_LEN
from panda import PandaJungle
from panda.tests.hitl.helpers import time_many_sends
Expand Down Expand Up @@ -44,14 +45,14 @@ def panda_init(serial, enable_canfd=False, enable_non_iso=False):
p.set_can_data_speed_kbps(bus, 2000)
if enable_non_iso:
p.set_canfd_non_iso(bus, True)
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
p.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
return p

def test_canfd_throughput(p, p_recv=None):
two_pandas = p_recv is not None
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
p.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
if two_pandas:
p_recv.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
p_recv.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
# enable output mode
else:
p.set_can_loopback(True)
Expand Down
3 changes: 2 additions & 1 deletion tests/echo.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
#!/usr/bin/env python3
from opendbc.safety import Safety
from panda import Panda

# This script is intended to be used in conjunction with the echo_loopback_test.py test script from panda jungle.
# It sends a reversed response back for every message received containing b"test".
if __name__ == "__main__":
p = Panda()
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
p.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
p.set_power_save(False)

while True:
Expand Down
3 changes: 2 additions & 1 deletion tests/elm_car_simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import threading
from collections import deque

from opendbc.safety import Safety
from panda import Panda

def lin_checksum(dat):
Expand Down Expand Up @@ -61,7 +62,7 @@ def set_enable(self, on):
self.__on = on

def start(self):
self.panda.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
self.panda.set_safety_mode(Safety.SAFETY_ALLOUTPUT)
if self.__lin_enable:
self.__lin_monitor_thread.start()
if self.__can_enable:
Expand Down
Loading

0 comments on commit 396465c

Please sign in to comment.