Merge pull request #634 from commaai/devel 0.5.11 Release
0.5.11 Devel -> Release2pull/646/head v0.5.11
commit
d1866845df
|
@ -0,0 +1,585 @@
|
|||
[MASTER]
|
||||
|
||||
# A comma-separated list of package or module names from where C extensions may
|
||||
# be loaded. Extensions are loading into the active Python interpreter and may
|
||||
# run arbitrary code
|
||||
extension-pkg-whitelist=scipy
|
||||
|
||||
# Add files or directories to the blacklist. They should be base names, not
|
||||
# paths.
|
||||
ignore=CVS
|
||||
|
||||
# Add files or directories matching the regex patterns to the blacklist. The
|
||||
# regex matches against base names, not paths.
|
||||
ignore-patterns=
|
||||
|
||||
# Python code to execute, usually for sys.path manipulation such as
|
||||
# pygtk.require().
|
||||
#init-hook=
|
||||
|
||||
# Use multiple processes to speed up Pylint.
|
||||
jobs=4
|
||||
|
||||
# List of plugins (as comma separated values of python modules names) to load,
|
||||
# usually to register additional checkers.
|
||||
load-plugins=
|
||||
|
||||
# Pickle collected data for later comparisons.
|
||||
persistent=yes
|
||||
|
||||
# Specify a configuration file.
|
||||
#rcfile=
|
||||
|
||||
# When enabled, pylint would attempt to guess common misconfiguration and emit
|
||||
# user-friendly hints instead of false-positive error messages
|
||||
suggestion-mode=yes
|
||||
|
||||
# Allow loading of arbitrary C extensions. Extensions are imported into the
|
||||
# active Python interpreter and may run arbitrary code.
|
||||
unsafe-load-any-extension=no
|
||||
|
||||
|
||||
[MESSAGES CONTROL]
|
||||
|
||||
# Only show warnings with the listed confidence levels. Leave empty to show
|
||||
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
|
||||
confidence=
|
||||
|
||||
# Disable the message, report, category or checker with the given id(s). You
|
||||
# can either give multiple identifiers separated by comma (,) or put this
|
||||
# option multiple times (only on the command line, not in the configuration
|
||||
# file where it should appear only once).You can also use "--disable=all" to
|
||||
# disable everything first and then reenable specific checks. For example, if
|
||||
# you want to run only the similarities checker, you can use "--disable=all
|
||||
# --enable=similarities". If you want to run only the classes checker, but have
|
||||
# no Warning level messages displayed, use"--disable=all --enable=classes
|
||||
# --disable=W"
|
||||
disable=print-statement,
|
||||
parameter-unpacking,
|
||||
unpacking-in-except,
|
||||
old-raise-syntax,
|
||||
backtick,
|
||||
long-suffix,
|
||||
old-ne-operator,
|
||||
old-octal-literal,
|
||||
import-star-module-level,
|
||||
non-ascii-bytes-literal,
|
||||
raw-checker-failed,
|
||||
bad-inline-option,
|
||||
locally-disabled,
|
||||
locally-enabled,
|
||||
file-ignored,
|
||||
suppressed-message,
|
||||
useless-suppression,
|
||||
deprecated-pragma,
|
||||
apply-builtin,
|
||||
basestring-builtin,
|
||||
buffer-builtin,
|
||||
cmp-builtin,
|
||||
coerce-builtin,
|
||||
execfile-builtin,
|
||||
file-builtin,
|
||||
long-builtin,
|
||||
raw_input-builtin,
|
||||
reduce-builtin,
|
||||
standarderror-builtin,
|
||||
unicode-builtin,
|
||||
xrange-builtin,
|
||||
coerce-method,
|
||||
delslice-method,
|
||||
getslice-method,
|
||||
setslice-method,
|
||||
no-absolute-import,
|
||||
old-division,
|
||||
dict-iter-method,
|
||||
dict-view-method,
|
||||
next-method-called,
|
||||
metaclass-assignment,
|
||||
indexing-exception,
|
||||
raising-string,
|
||||
reload-builtin,
|
||||
oct-method,
|
||||
hex-method,
|
||||
nonzero-method,
|
||||
cmp-method,
|
||||
input-builtin,
|
||||
round-builtin,
|
||||
intern-builtin,
|
||||
unichr-builtin,
|
||||
map-builtin-not-iterating,
|
||||
zip-builtin-not-iterating,
|
||||
range-builtin-not-iterating,
|
||||
filter-builtin-not-iterating,
|
||||
using-cmp-argument,
|
||||
eq-without-hash,
|
||||
div-method,
|
||||
idiv-method,
|
||||
rdiv-method,
|
||||
exception-message-attribute,
|
||||
invalid-str-codec,
|
||||
sys-max-int,
|
||||
bad-python3-import,
|
||||
deprecated-string-function,
|
||||
deprecated-str-translate-call,
|
||||
deprecated-itertools-function,
|
||||
deprecated-types-field,
|
||||
next-method-defined,
|
||||
dict-items-not-iterating,
|
||||
dict-keys-not-iterating,
|
||||
dict-values-not-iterating,
|
||||
bad-indentation,
|
||||
line-too-long,
|
||||
missing-docstring,
|
||||
multiple-statements,
|
||||
bad-continuation,
|
||||
invalid-name,
|
||||
too-many-arguments,
|
||||
too-many-locals,
|
||||
superfluous-parens,
|
||||
bad-whitespace,
|
||||
too-many-instance-attributes,
|
||||
wrong-import-position,
|
||||
ungrouped-imports,
|
||||
wrong-import-order,
|
||||
protected-access,
|
||||
trailing-whitespace,
|
||||
too-many-branches,
|
||||
too-few-public-methods,
|
||||
too-many-statements,
|
||||
trailing-newlines,
|
||||
attribute-defined-outside-init,
|
||||
too-many-return-statements,
|
||||
too-many-public-methods,
|
||||
unused-argument,
|
||||
old-style-class,
|
||||
no-init,
|
||||
len-as-condition,
|
||||
unneeded-not,
|
||||
no-self-use,
|
||||
multiple-imports,
|
||||
no-else-return,
|
||||
logging-not-lazy,
|
||||
fixme,
|
||||
redefined-outer-name,
|
||||
unused-variable,
|
||||
unsubscriptable-object,
|
||||
expression-not-assigned,
|
||||
too-many-boolean-expressions,
|
||||
consider-using-ternary,
|
||||
invalid-unary-operand-type,
|
||||
relative-import,
|
||||
deprecated-lambda
|
||||
|
||||
|
||||
# Enable the message, report, category or checker with the given id(s). You can
|
||||
# either give multiple identifier separated by comma (,) or put this option
|
||||
# multiple time (only on the command line, not in the configuration file where
|
||||
# it should appear only once). See also the "--disable" option for examples.
|
||||
enable=c-extension-no-member
|
||||
|
||||
|
||||
[REPORTS]
|
||||
|
||||
# Python expression which should return a note less than 10 (10 is the highest
|
||||
# note). You have access to the variables errors warning, statement which
|
||||
# respectively contain the number of errors / warnings messages and the total
|
||||
# number of statements analyzed. This is used by the global evaluation report
|
||||
# (RP0004).
|
||||
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
|
||||
|
||||
# Template used to display messages. This is a python new-style format string
|
||||
# used to format the message information. See doc for all details
|
||||
#msg-template=
|
||||
|
||||
# Set the output format. Available formats are text, parseable, colorized, json
|
||||
# and msvs (visual studio).You can also give a reporter class, eg
|
||||
# mypackage.mymodule.MyReporterClass.
|
||||
output-format=text
|
||||
|
||||
# Tells whether to display a full report or only the messages
|
||||
reports=no
|
||||
|
||||
# Activate the evaluation score.
|
||||
score=yes
|
||||
|
||||
|
||||
[REFACTORING]
|
||||
|
||||
# Maximum number of nested blocks for function / method body
|
||||
max-nested-blocks=5
|
||||
|
||||
# Complete name of functions that never returns. When checking for
|
||||
# inconsistent-return-statements if a never returning function is called then
|
||||
# it will be considered as an explicit return statement and no message will be
|
||||
# printed.
|
||||
never-returning-functions=optparse.Values,sys.exit
|
||||
|
||||
|
||||
[LOGGING]
|
||||
|
||||
# Logging modules to check that the string format arguments are in logging
|
||||
# function parameter format
|
||||
logging-modules=logging
|
||||
|
||||
|
||||
[SPELLING]
|
||||
|
||||
# Limits count of emitted suggestions for spelling mistakes
|
||||
max-spelling-suggestions=4
|
||||
|
||||
# Spelling dictionary name. Available dictionaries: none. To make it working
|
||||
# install python-enchant package.
|
||||
spelling-dict=
|
||||
|
||||
# List of comma separated words that should not be checked.
|
||||
spelling-ignore-words=
|
||||
|
||||
# A path to a file that contains private dictionary; one word per line.
|
||||
spelling-private-dict-file=
|
||||
|
||||
# Tells whether to store unknown words to indicated private dictionary in
|
||||
# --spelling-private-dict-file option instead of raising a message.
|
||||
spelling-store-unknown-words=no
|
||||
|
||||
|
||||
[MISCELLANEOUS]
|
||||
|
||||
# List of note tags to take in consideration, separated by a comma.
|
||||
notes=FIXME,
|
||||
XXX,
|
||||
TODO
|
||||
|
||||
|
||||
[SIMILARITIES]
|
||||
|
||||
# Ignore comments when computing similarities.
|
||||
ignore-comments=yes
|
||||
|
||||
# Ignore docstrings when computing similarities.
|
||||
ignore-docstrings=yes
|
||||
|
||||
# Ignore imports when computing similarities.
|
||||
ignore-imports=no
|
||||
|
||||
# Minimum lines number of a similarity.
|
||||
min-similarity-lines=4
|
||||
|
||||
|
||||
[TYPECHECK]
|
||||
|
||||
# List of decorators that produce context managers, such as
|
||||
# contextlib.contextmanager. Add to this list to register other decorators that
|
||||
# produce valid context managers.
|
||||
contextmanager-decorators=contextlib.contextmanager
|
||||
|
||||
# List of members which are set dynamically and missed by pylint inference
|
||||
# system, and so shouldn't trigger E1101 when accessed. Python regular
|
||||
# expressions are accepted.
|
||||
generated-members=capnp.* cereal.* pygame.* zmq.* setproctitle.* smbus2.* usb1.* serial.* cv2.*
|
||||
|
||||
# Tells whether missing members accessed in mixin class should be ignored. A
|
||||
# mixin class is detected if its name ends with "mixin" (case insensitive).
|
||||
ignore-mixin-members=yes
|
||||
|
||||
# This flag controls whether pylint should warn about no-member and similar
|
||||
# checks whenever an opaque object is returned when inferring. The inference
|
||||
# can return multiple potential results while evaluating a Python object, but
|
||||
# some branches might not be evaluated, which results in partial inference. In
|
||||
# that case, it might be useful to still emit no-member and other checks for
|
||||
# the rest of the inferred objects.
|
||||
ignore-on-opaque-inference=yes
|
||||
|
||||
# List of class names for which member attributes should not be checked (useful
|
||||
# for classes with dynamically set attributes). This supports the use of
|
||||
# qualified names.
|
||||
ignored-classes=optparse.Values,thread._local,_thread._local
|
||||
|
||||
# List of module names for which member attributes should not be checked
|
||||
# (useful for modules/projects where namespaces are manipulated during runtime
|
||||
# and thus existing member attributes cannot be deduced by static analysis. It
|
||||
# supports qualified module names, as well as Unix pattern matching.
|
||||
ignored-modules=flask setproctitle usb1 flask.ext.socketio smbus2 usb1.*
|
||||
|
||||
# Show a hint with possible names when a member name was not found. The aspect
|
||||
# of finding the hint is based on edit distance.
|
||||
missing-member-hint=yes
|
||||
|
||||
# The minimum edit distance a name should have in order to be considered a
|
||||
# similar match for a missing member name.
|
||||
missing-member-hint-distance=1
|
||||
|
||||
# The total number of similar names that should be taken in consideration when
|
||||
# showing a hint for a missing member.
|
||||
missing-member-max-choices=1
|
||||
|
||||
|
||||
[VARIABLES]
|
||||
|
||||
# List of additional names supposed to be defined in builtins. Remember that
|
||||
# you should avoid to define new builtins when possible.
|
||||
additional-builtins=
|
||||
|
||||
# Tells whether unused global variables should be treated as a violation.
|
||||
allow-global-unused-variables=yes
|
||||
|
||||
# List of strings which can identify a callback function by name. A callback
|
||||
# name must start or end with one of those strings.
|
||||
callbacks=cb_,
|
||||
_cb
|
||||
|
||||
# A regular expression matching the name of dummy variables (i.e. expectedly
|
||||
# not used).
|
||||
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
|
||||
|
||||
# Argument names that match this expression will be ignored. Default to name
|
||||
# with leading underscore
|
||||
ignored-argument-names=_.*|^ignored_|^unused_
|
||||
|
||||
# Tells whether we should check for unused import in __init__ files.
|
||||
init-import=no
|
||||
|
||||
# List of qualified module names which can have objects that can redefine
|
||||
# builtins.
|
||||
redefining-builtins-modules=six.moves,past.builtins,future.builtins
|
||||
|
||||
|
||||
[FORMAT]
|
||||
|
||||
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
|
||||
expected-line-ending-format=
|
||||
|
||||
# Regexp for a line that is allowed to be longer than the limit.
|
||||
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
|
||||
|
||||
# Number of spaces of indent required inside a hanging or continued line.
|
||||
indent-after-paren=4
|
||||
|
||||
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
|
||||
# tab).
|
||||
indent-string=' '
|
||||
|
||||
# Maximum number of characters on a single line.
|
||||
max-line-length=100
|
||||
|
||||
# Maximum number of lines in a module
|
||||
max-module-lines=1000
|
||||
|
||||
# List of optional constructs for which whitespace checking is disabled. `dict-
|
||||
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
|
||||
# `trailing-comma` allows a space between comma and closing bracket: (a, ).
|
||||
# `empty-line` allows space-only lines.
|
||||
no-space-check=trailing-comma,
|
||||
dict-separator
|
||||
|
||||
# Allow the body of a class to be on the same line as the declaration if body
|
||||
# contains single statement.
|
||||
single-line-class-stmt=no
|
||||
|
||||
# Allow the body of an if to be on the same line as the test if there is no
|
||||
# else.
|
||||
single-line-if-stmt=no
|
||||
|
||||
|
||||
[BASIC]
|
||||
|
||||
# Naming style matching correct argument names
|
||||
argument-naming-style=snake_case
|
||||
|
||||
# Regular expression matching correct argument names. Overrides argument-
|
||||
# naming-style
|
||||
#argument-rgx=
|
||||
|
||||
# Naming style matching correct attribute names
|
||||
attr-naming-style=snake_case
|
||||
|
||||
# Regular expression matching correct attribute names. Overrides attr-naming-
|
||||
# style
|
||||
#attr-rgx=
|
||||
|
||||
# Bad variable names which should always be refused, separated by a comma
|
||||
bad-names=foo,
|
||||
bar,
|
||||
baz,
|
||||
toto,
|
||||
tutu,
|
||||
tata
|
||||
|
||||
# Naming style matching correct class attribute names
|
||||
class-attribute-naming-style=any
|
||||
|
||||
# Regular expression matching correct class attribute names. Overrides class-
|
||||
# attribute-naming-style
|
||||
#class-attribute-rgx=
|
||||
|
||||
# Naming style matching correct class names
|
||||
class-naming-style=PascalCase
|
||||
|
||||
# Regular expression matching correct class names. Overrides class-naming-style
|
||||
#class-rgx=
|
||||
|
||||
# Naming style matching correct constant names
|
||||
const-naming-style=UPPER_CASE
|
||||
|
||||
# Regular expression matching correct constant names. Overrides const-naming-
|
||||
# style
|
||||
#const-rgx=
|
||||
|
||||
# Minimum line length for functions/classes that require docstrings, shorter
|
||||
# ones are exempt.
|
||||
docstring-min-length=-1
|
||||
|
||||
# Naming style matching correct function names
|
||||
function-naming-style=snake_case
|
||||
|
||||
# Regular expression matching correct function names. Overrides function-
|
||||
# naming-style
|
||||
#function-rgx=
|
||||
|
||||
# Good variable names which should always be accepted, separated by a comma
|
||||
good-names=i,
|
||||
j,
|
||||
k,
|
||||
ex,
|
||||
Run,
|
||||
_
|
||||
|
||||
# Include a hint for the correct naming format with invalid-name
|
||||
include-naming-hint=no
|
||||
|
||||
# Naming style matching correct inline iteration names
|
||||
inlinevar-naming-style=any
|
||||
|
||||
# Regular expression matching correct inline iteration names. Overrides
|
||||
# inlinevar-naming-style
|
||||
#inlinevar-rgx=
|
||||
|
||||
# Naming style matching correct method names
|
||||
method-naming-style=snake_case
|
||||
|
||||
# Regular expression matching correct method names. Overrides method-naming-
|
||||
# style
|
||||
#method-rgx=
|
||||
|
||||
# Naming style matching correct module names
|
||||
module-naming-style=snake_case
|
||||
|
||||
# Regular expression matching correct module names. Overrides module-naming-
|
||||
# style
|
||||
#module-rgx=
|
||||
|
||||
# Colon-delimited sets of names that determine each other's naming style when
|
||||
# the name regexes allow several styles.
|
||||
name-group=
|
||||
|
||||
# Regular expression which should only match function or class names that do
|
||||
# not require a docstring.
|
||||
no-docstring-rgx=^_
|
||||
|
||||
# List of decorators that produce properties, such as abc.abstractproperty. Add
|
||||
# to this list to register other decorators that produce valid properties.
|
||||
property-classes=abc.abstractproperty
|
||||
|
||||
# Naming style matching correct variable names
|
||||
variable-naming-style=snake_case
|
||||
|
||||
# Regular expression matching correct variable names. Overrides variable-
|
||||
# naming-style
|
||||
#variable-rgx=
|
||||
|
||||
|
||||
[DESIGN]
|
||||
|
||||
# Maximum number of arguments for function / method
|
||||
max-args=5
|
||||
|
||||
# Maximum number of attributes for a class (see R0902).
|
||||
max-attributes=7
|
||||
|
||||
# Maximum number of boolean expressions in a if statement
|
||||
max-bool-expr=5
|
||||
|
||||
# Maximum number of branch for function / method body
|
||||
max-branches=12
|
||||
|
||||
# Maximum number of locals for function / method body
|
||||
max-locals=15
|
||||
|
||||
# Maximum number of parents for a class (see R0901).
|
||||
max-parents=7
|
||||
|
||||
# Maximum number of public methods for a class (see R0904).
|
||||
max-public-methods=20
|
||||
|
||||
# Maximum number of return / yield for function / method body
|
||||
max-returns=6
|
||||
|
||||
# Maximum number of statements in function / method body
|
||||
max-statements=50
|
||||
|
||||
# Minimum number of public methods for a class (see R0903).
|
||||
min-public-methods=2
|
||||
|
||||
|
||||
[CLASSES]
|
||||
|
||||
# List of method names used to declare (i.e. assign) instance attributes.
|
||||
defining-attr-methods=__init__,
|
||||
__new__,
|
||||
setUp
|
||||
|
||||
# List of member names, which should be excluded from the protected access
|
||||
# warning.
|
||||
exclude-protected=_asdict,
|
||||
_fields,
|
||||
_replace,
|
||||
_source,
|
||||
_make
|
||||
|
||||
# List of valid names for the first argument in a class method.
|
||||
valid-classmethod-first-arg=cls
|
||||
|
||||
# List of valid names for the first argument in a metaclass class method.
|
||||
valid-metaclass-classmethod-first-arg=mcs
|
||||
|
||||
|
||||
[IMPORTS]
|
||||
|
||||
# Allow wildcard imports from modules that define __all__.
|
||||
allow-wildcard-with-all=no
|
||||
|
||||
# Analyse import fallback blocks. This can be used to support both Python 2 and
|
||||
# 3 compatible code, which means that the block might have code that exists
|
||||
# only in one or another interpreter, leading to false positives when analysed.
|
||||
analyse-fallback-blocks=no
|
||||
|
||||
# Deprecated modules which should not be used, separated by a comma
|
||||
deprecated-modules=regsub,
|
||||
TERMIOS,
|
||||
Bastion,
|
||||
rexec
|
||||
|
||||
# Create a graph of external dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
ext-import-graph=
|
||||
|
||||
# Create a graph of every (i.e. internal and external) dependencies in the
|
||||
# given file (report RP0402 must not be disabled)
|
||||
import-graph=
|
||||
|
||||
# Create a graph of internal dependencies in the given file (report RP0402 must
|
||||
# not be disabled)
|
||||
int-import-graph=
|
||||
|
||||
# Force import order to recognize a module as part of the standard
|
||||
# compatibility libraries.
|
||||
known-standard-library=
|
||||
|
||||
# Force import order to recognize a module as part of a third party library.
|
||||
known-third-party=enchant
|
||||
|
||||
|
||||
[EXCEPTIONS]
|
||||
|
||||
# Exceptions that will emit a warning when being caught. Defaults to
|
||||
# "Exception"
|
||||
overgeneral-exceptions=Exception
|
|
@ -7,8 +7,12 @@ install:
|
|||
- docker build -t tmppilot -f Dockerfile.openpilot .
|
||||
|
||||
script:
|
||||
- docker run
|
||||
tmppilot /bin/sh -c 'cd /tmp/openpilot/selfdrive/test/ && ./test_fingerprints.py'
|
||||
- docker run
|
||||
tmppilot /bin/sh -c 'cd /tmp/openpilot/ && pyflakes $(find . -iname "*.py" | grep -vi "^\./pyextra.*" | grep -vi "^\./panda")'
|
||||
- docker run
|
||||
tmppilot /bin/sh -c 'cd /tmp/openpilot/ && pylint $(find . -iname "*.py" | grep -vi "^\./pyextra.*" | grep -vi "^\./panda"); exit $(($? & 3))'
|
||||
- docker run
|
||||
-v "$(pwd)"/selfdrive/test/tests/plant/out:/tmp/openpilot/selfdrive/test/tests/plant/out
|
||||
tmppilot /bin/sh -c 'cd /tmp/openpilot/selfdrive/test/tests/plant && OPTEST=1 ./test_longitudinal.py'
|
||||
- docker run
|
||||
tmppilot /bin/sh -c 'cd /tmp/openpilot/selfdrive/test/ && ./test_fingerprints.py'
|
||||
|
|
|
@ -21,6 +21,7 @@ RUN apt-get update && apt-get install -y \
|
|||
ocl-icd-opencl-dev \
|
||||
opencl-headers
|
||||
|
||||
RUN pip install --upgrade pip==18.0
|
||||
RUN pip install numpy==1.11.2 scipy==0.18.1 matplotlib==2.1.2
|
||||
|
||||
COPY requirements_openpilot.txt /tmp/
|
||||
|
@ -28,12 +29,14 @@ RUN pip install -r /tmp/requirements_openpilot.txt
|
|||
|
||||
ENV PYTHONPATH /tmp/openpilot:$PYTHONPATH
|
||||
|
||||
COPY ./.pylintrc /tmp/openpilot/.pylintrc
|
||||
COPY ./common /tmp/openpilot/common
|
||||
COPY ./cereal /tmp/openpilot/cereal
|
||||
COPY ./opendbc /tmp/openpilot/opendbc
|
||||
COPY ./selfdrive /tmp/openpilot/selfdrive
|
||||
COPY ./phonelibs /tmp/openpilot/phonelibs
|
||||
COPY ./pyextra /tmp/openpilot/pyextra
|
||||
COPY ./panda /tmp/openpilot/panda
|
||||
|
||||
RUN mkdir -p /tmp/openpilot/selfdrive/test/out
|
||||
RUN make -C /tmp/openpilot/selfdrive/controls/lib/longitudinal_mpc clean
|
||||
|
|
13
README.md
13
README.md
|
@ -68,6 +68,7 @@ Supported Cars
|
|||
| Cadillac<sup>3</sup> | ATS 2018 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom<sup>7</sup>|
|
||||
| Chrysler | Pacifica 2018 | Adaptive Cruise | Yes | Stock | 0mph | 9mph | FCA |
|
||||
| Chrysler | Pacifica Hybrid 2017-18 | Adaptive Cruise | Yes | Stock | 0mph | 9mph | FCA |
|
||||
| Chrysler | Pacifica Hybrid 2019 | Adaptive Cruise | Yes | Stock | 0mph | 39mph | FCA |
|
||||
| GMC<sup>3</sup> | Acadia Denali 2018 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom<sup>7</sup>|
|
||||
| Holden<sup>3</sup> | Astra 2017 | Adaptive Cruise | Yes | Yes | 0mph | 7mph | Custom<sup>7</sup>|
|
||||
| Honda | Accord 2018 | All | Yes | Stock | 0mph | 3mph | Bosch |
|
||||
|
@ -76,26 +77,30 @@ Supported Cars
|
|||
| Honda | Civic Hatchback 2017-19 | Honda Sensing | Yes | Stock | 0mph | 12mph | Bosch |
|
||||
| Honda | CR-V 2015-16 | Touring | Yes | Yes | 25mph<sup>1</sup>| 12mph | Nidec |
|
||||
| Honda | CR-V 2017-18 | Honda Sensing | Yes | Stock | 0mph | 12mph | Bosch |
|
||||
| Honda | CR-V Hybrid 2019 | All | Yes | Stock | 0mph | 12mph | Bosch |
|
||||
| Honda | Odyssey 2017-19 | Honda Sensing | Yes | Yes | 25mph<sup>1</sup>| 0mph | Inverted Nidec |
|
||||
| Honda | Passport 2019 | All | Yes | Yes | 25mph<sup>1</sup>| 12mph | Inverted Nidec |
|
||||
| Honda | Pilot 2016-18 | Honda Sensing | Yes | Yes | 25mph<sup>1</sup>| 12mph | Nidec |
|
||||
| Honda | Pilot 2019 | All | Yes | Yes | 25mph<sup>1</sup>| 12mph | Inverted Nidec |
|
||||
| Honda | Ridgeline 2017-19 | Honda Sensing | Yes | Yes | 25mph<sup>1</sup>| 12mph | Nidec |
|
||||
| Hyundai | Santa Fe 2019 | All | Yes | Stock | 0mph | 0mph | Custom<sup>6</sup>|
|
||||
| Hyundai | Elantra 2017 | SCC + LKAS | Yes | Stock | 19mph | 34mph | Custom<sup>6</sup>|
|
||||
| Hyundai | Genesis 2018 | All | Yes | Stock | 19mph | 34mph | Custom<sup>6</sup>|
|
||||
| Jeep | Grand Cherokee 2017-19 | Adaptive Cruise | Yes | Stock | 0mph | 9mph | FCA |
|
||||
| Jeep | Grand Cherokee 2017-18 | Adaptive Cruise | Yes | Stock | 0mph | 9mph | FCA |
|
||||
| Jeep | Grand Cherokee 2019 | Adaptive Cruise | Yes | Stock | 0mph | 39mph | FCA |
|
||||
| Kia | Optima 2019 | SCC + LKAS | Yes | Stock | 0mph | 0mph | Custom<sup>6</sup>|
|
||||
| Kia | Sorento 2018 | All | Yes | Stock | 0mph | 0mph | Custom<sup>6</sup>|
|
||||
| Kia | Stinger 2018 | SCC + LKAS | Yes | Stock | 0mph | 0mph | Custom<sup>6</sup>|
|
||||
| Lexus | RX Hybrid 2016-18 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Lexus | RX Hybrid 2016-19 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Subaru | Impreza 2019 | EyeSight | Yes | Stock | 0mph | 0mph | Subaru |
|
||||
| Toyota | Camry 2018<sup>4</sup> | All | Yes | Stock | 0mph<sup>5</sup> | 0mph | Toyota |
|
||||
| Toyota | C-HR 2017-18<sup>4</sup> | All | Yes | Stock | 0mph | 0mph | Toyota |
|
||||
| Toyota | Corolla 2017-18 | All | Yes | Yes<sup>2</sup>| 20mph<sup>1</sup>| 0mph | Toyota |
|
||||
| Toyota | Highlander 2017-18 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Toyota | Highlander Hybrid 2018 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Toyota | Prius 2016 | TSS-P | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Toyota | Prius 2017-18 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Toyota | Prius Prime 2017-18 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Toyota | Prius 2017-19 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Toyota | Prius Prime 2017-19 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
| Toyota | Rav4 2016 | TSS-P | Yes | Yes<sup>2</sup>| 20mph<sup>1</sup>| 0mph | Toyota |
|
||||
| Toyota | Rav4 2017-18 | All | Yes | Yes<sup>2</sup>| 20mph<sup>1</sup>| 0mph | Toyota |
|
||||
| Toyota | Rav4 Hybrid 2017-18 | All | Yes | Yes<sup>2</sup>| 0mph | 0mph | Toyota |
|
||||
|
|
20
RELEASES.md
20
RELEASES.md
|
@ -1,13 +1,27 @@
|
|||
Version 0.5.11 (2019-04-17)
|
||||
========================
|
||||
* Add support for Subaru
|
||||
* Reduce panda power consumption by 60% when car is off
|
||||
* Fix controlsd lag every 6 minutes. This would sometimes cause disengagements
|
||||
* Fix bug in controls with new angle-offset learner in MPC
|
||||
* Reduce cpu consumption of ubloxd by rewriting it in C++
|
||||
* Improve driver monitoring model and face detection
|
||||
* Improve performance of visiond and ui
|
||||
* Honda Passport 2019 support
|
||||
* Lexus RX Hybrid 2019 support thanks to schomems!
|
||||
* Improve road selection heuristic in mapd
|
||||
* Add Lane Departure Warning to dashboard for Toyota thanks to arne182
|
||||
|
||||
Version 0.5.10 (2019-03-19)
|
||||
========================
|
||||
* Self-tuning vehicle parameters: steering offset, tires stiffness and steering ratio
|
||||
* Self-tuning vehicle parameters: steering offset, tire stiffness and steering ratio
|
||||
* Improve longitudinal control at low speed when lead vehicle harshly decelerates
|
||||
* Fix panda bug going unexpectedly in DCP mode when EON is connected
|
||||
* Reduce white panda power consumption by 500mW when EON is disconnected by turning off WIFI
|
||||
* New Driver Monitoring Model
|
||||
* Support QR codes for login using comma connect
|
||||
* Refactor comma pedal FW and use CRC-8 checksum algorithm for safety. Reflashing pedal is required.
|
||||
Please see `#hw-pedal` on [discord](discord.comma.ai) for assistance updating comma pedal.
|
||||
* Refactor comma pedal FW and use CRC-8 checksum algorithm for safety. Reflashing pedal is required.
|
||||
Please see `#hw-pedal` on [discord](discord.comma.ai) for assistance updating comma pedal.
|
||||
* Additional speed limit rules for Germany thanks to arne182
|
||||
* Allow negative speed limit offsets
|
||||
|
||||
|
|
13
SAFETY.md
13
SAFETY.md
|
@ -133,6 +133,19 @@ Chrysler/Jeep/Fiat (Lateral only)
|
|||
units above the actual EPS generated motor torque to ensure limited differences between
|
||||
commanded and actual torques.
|
||||
|
||||
Subaru (Lateral only)
|
||||
------
|
||||
|
||||
- While the system is engaged, steer commands are subject to the same limits used by
|
||||
the stock system.
|
||||
|
||||
- Steering torque is controlled through the 0x122 CAN message and it's limited by the panda firmware and by
|
||||
openpilot to a value between -255 and 255. In addition, the vehicle EPS unit will fault for
|
||||
commands outside the values of -2047 and 2047. A steering torque rate limit is enforced by the panda firmware and by
|
||||
openpilot, so that the commanded steering torque must rise from 0 to max value no faster than
|
||||
0.41s. Commanded steering torque is gradually limited by the panda firmware and by openpilot if the driver's
|
||||
torque exceeds 60 units in the opposite dicrection to ensure limited applied torque against the
|
||||
driver's will.
|
||||
|
||||
**Extra note**: comma.ai strongly discourages the use of openpilot forks with safety code either missing or
|
||||
not fully meeting the above requirements.
|
||||
|
|
Binary file not shown.
|
@ -247,6 +247,8 @@ struct CarControl {
|
|||
audibleAlert @5: AudibleAlert;
|
||||
rightLaneVisible @6: Bool;
|
||||
leftLaneVisible @7: Bool;
|
||||
rightLaneDepart @8: Bool;
|
||||
leftLaneDepart @9: Bool;
|
||||
|
||||
enum VisualAlert {
|
||||
# these are the choices from the Honda
|
||||
|
|
|
@ -7,9 +7,9 @@ from collections import namedtuple, defaultdict
|
|||
|
||||
def int_or_float(s):
|
||||
# return number, trying to maintain int format
|
||||
try:
|
||||
return int(s)
|
||||
except ValueError:
|
||||
if s.isdigit():
|
||||
return int(s, 10)
|
||||
else:
|
||||
return float(s)
|
||||
|
||||
DBCSignal = namedtuple(
|
||||
|
@ -21,7 +21,7 @@ class dbc(object):
|
|||
def __init__(self, fn):
|
||||
self.name, _ = os.path.splitext(os.path.basename(fn))
|
||||
with open(fn) as f:
|
||||
self.txt = f.read().split("\n")
|
||||
self.txt = f.readlines()
|
||||
self._warned_addresses = set()
|
||||
|
||||
# regexps from https://github.com/ebroecker/canmatrix/blob/master/canmatrix/importdbc.py
|
||||
|
@ -51,7 +51,8 @@ class dbc(object):
|
|||
dat = bo_regexp.match(l)
|
||||
|
||||
if dat is None:
|
||||
print "bad BO", l
|
||||
print("bad BO {0}".format(l))
|
||||
|
||||
name = dat.group(2)
|
||||
size = int(dat.group(3))
|
||||
ids = int(dat.group(1), 0) # could be hex
|
||||
|
@ -67,8 +68,9 @@ class dbc(object):
|
|||
if dat is None:
|
||||
dat = sgm_regexp.match(l)
|
||||
go = 1
|
||||
|
||||
if dat is None:
|
||||
print "bad SG", l
|
||||
print("bad SG {0}".format(l))
|
||||
|
||||
sgname = dat.group(1)
|
||||
start_bit = int(dat.group(go+2))
|
||||
|
@ -90,12 +92,13 @@ class dbc(object):
|
|||
dat = val_regexp.match(l)
|
||||
|
||||
if dat is None:
|
||||
print "bad VAL", l
|
||||
print("bad VAL {0}".format(l))
|
||||
|
||||
ids = int(dat.group(1), 0) # could be hex
|
||||
sgname = dat.group(2)
|
||||
defvals = dat.group(3)
|
||||
|
||||
defvals = defvals.replace("?","\?") #escape sequence in C++
|
||||
defvals = defvals.replace("?",r"\?") #escape sequence in C++
|
||||
defvals = defvals.split('"')[:-1]
|
||||
|
||||
defs = defvals[1::2]
|
||||
|
@ -109,7 +112,7 @@ class dbc(object):
|
|||
|
||||
self.def_vals[ids].append((sgname, defvals))
|
||||
|
||||
for msg in self.msgs.viewvalues():
|
||||
for msg in self.msgs.values():
|
||||
msg[1].sort(key=lambda x: x.start_bit)
|
||||
|
||||
self.msg_name_to_address = {}
|
||||
|
@ -208,7 +211,7 @@ class dbc(object):
|
|||
|
||||
name = msg[0][0]
|
||||
if debug:
|
||||
print name
|
||||
print(name)
|
||||
|
||||
st = x[2].ljust(8, '\x00')
|
||||
le, be = None, None
|
||||
|
@ -252,7 +255,7 @@ class dbc(object):
|
|||
tmp = tmp * factor + offset
|
||||
|
||||
# if debug:
|
||||
# print "%40s %2d %2d %7.2f %s" % (s[0], s[1], s[2], tmp, s[-1])
|
||||
# print("%40s %2d %2d %7.2f %s" % (s[0], s[1], s[2], tmp, s[-1]))
|
||||
|
||||
if arr is None:
|
||||
out[s[0]] = tmp
|
||||
|
|
|
@ -4,10 +4,8 @@ import fcntl
|
|||
import hashlib
|
||||
from cffi import FFI
|
||||
|
||||
TMPDIR = "/tmp/ccache"
|
||||
|
||||
|
||||
def ffi_wrap(name, c_code, c_header, tmpdir=TMPDIR, cflags="", libraries=None):
|
||||
def ffi_wrap(name, c_code, c_header, tmpdir="/tmp/ccache", cflags="", libraries=None):
|
||||
if libraries is None:
|
||||
libraries = []
|
||||
|
||||
|
@ -24,7 +22,7 @@ def ffi_wrap(name, c_code, c_header, tmpdir=TMPDIR, cflags="", libraries=None):
|
|||
try:
|
||||
mod = __import__(cache)
|
||||
except Exception:
|
||||
print "cache miss", cache
|
||||
print("cache miss {0}".format(cache))
|
||||
compile_code(cache, c_code, c_header, tmpdir, cflags, libraries)
|
||||
mod = __import__(cache)
|
||||
finally:
|
||||
|
|
|
@ -61,4 +61,4 @@ def eliminate_incompatible_cars(msg, candidate_cars):
|
|||
|
||||
def all_known_cars():
|
||||
"""Returns a list of all known car strings."""
|
||||
return _FINGERPRINTS.keys()
|
||||
return list(_FINGERPRINTS.keys())
|
||||
|
|
|
@ -75,7 +75,7 @@ def sympy_into_c(sympy_functions):
|
|||
routines.append(r)
|
||||
|
||||
[(c_name, c_code), (h_name, c_header)] = codegen.get_code_generator('C', 'ekf', 'C99').write(routines, "ekf")
|
||||
c_code = '\n'.join(filter(lambda x: len(x) > 0 and x[0] != '#', c_code.split("\n")))
|
||||
c_header = '\n'.join(filter(lambda x: len(x) > 0 and x[0] != '#', c_header.split("\n")))
|
||||
c_code = '\n'.join(x for x in c_code.split("\n") if len(x) > 0 and x[0] != '#')
|
||||
c_header = '\n'.join(x for x in c_header.split("\n") if len(x) > 0 and x[0] != '#')
|
||||
|
||||
return c_header, c_code
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import numpy as np
|
||||
import common.transformations.orientation as orient
|
||||
import cv2
|
||||
import math
|
||||
|
||||
FULL_FRAME_SIZE = (1164, 874)
|
||||
W, H = FULL_FRAME_SIZE[0], FULL_FRAME_SIZE[1]
|
||||
|
@ -12,6 +13,17 @@ eon_intrinsics = np.array([
|
|||
[ 0., FOCAL, H/2.],
|
||||
[ 0., 0., 1.]])
|
||||
|
||||
|
||||
leon_dcam_intrinsics = np.array([
|
||||
[650, 0, 816//2],
|
||||
[ 0, 650, 612//2],
|
||||
[ 0, 0, 1]])
|
||||
|
||||
eon_dcam_intrinsics = np.array([
|
||||
[860, 0, 1152//2],
|
||||
[ 0, 860, 864//2],
|
||||
[ 0, 0, 1]])
|
||||
|
||||
# aka 'K_inv' aka view_frame_from_camera_frame
|
||||
eon_intrinsics_inv = np.linalg.inv(eon_intrinsics)
|
||||
|
||||
|
@ -64,7 +76,7 @@ def normalize(img_pts, intrinsics=eon_intrinsics):
|
|||
input_shape = img_pts.shape
|
||||
img_pts = np.atleast_2d(img_pts)
|
||||
img_pts = np.hstack((img_pts, np.ones((img_pts.shape[0],1))))
|
||||
img_pts_normalized = intrinsics_inv.dot(img_pts.T).T
|
||||
img_pts_normalized = img_pts.dot(intrinsics_inv.T)
|
||||
img_pts_normalized[(img_pts < 0).any(axis=1)] = np.nan
|
||||
return img_pts_normalized[:,:2].reshape(input_shape)
|
||||
|
||||
|
@ -76,7 +88,7 @@ def denormalize(img_pts, intrinsics=eon_intrinsics):
|
|||
input_shape = img_pts.shape
|
||||
img_pts = np.atleast_2d(img_pts)
|
||||
img_pts = np.hstack((img_pts, np.ones((img_pts.shape[0],1))))
|
||||
img_pts_denormalized = intrinsics.dot(img_pts.T).T
|
||||
img_pts_denormalized = img_pts.dot(intrinsics.T)
|
||||
img_pts_denormalized[img_pts_denormalized[:,0] > W] = np.nan
|
||||
img_pts_denormalized[img_pts_denormalized[:,0] < 0] = np.nan
|
||||
img_pts_denormalized[img_pts_denormalized[:,1] > H] = np.nan
|
||||
|
@ -147,28 +159,44 @@ def transform_img(base_img,
|
|||
from_intr=eon_intrinsics,
|
||||
to_intr=eon_intrinsics,
|
||||
calib_rot_view=None,
|
||||
output_size=None):
|
||||
cy = from_intr[1,2]
|
||||
output_size=None,
|
||||
pretransform=None,
|
||||
top_hacks=True):
|
||||
size = base_img.shape[:2]
|
||||
if not output_size:
|
||||
output_size = size[::-1]
|
||||
h = 1.22
|
||||
quadrangle = np.array([[0, cy + 20],
|
||||
[size[1]-1, cy + 20],
|
||||
[0, size[0]-1],
|
||||
[size[1]-1, size[0]-1]], dtype=np.float32)
|
||||
quadrangle_norm = np.hstack((normalize(quadrangle, intrinsics=from_intr), np.ones((4,1))))
|
||||
quadrangle_world = np.column_stack((h*quadrangle_norm[:,0]/quadrangle_norm[:,1],
|
||||
h*np.ones(4),
|
||||
h/quadrangle_norm[:,1]))
|
||||
rot = orient.rot_from_euler(augment_eulers)
|
||||
if calib_rot_view is not None:
|
||||
rot = calib_rot_view.dot(rot)
|
||||
to_extrinsics = np.hstack((rot.T, -augment_trans[:,None]))
|
||||
to_KE = to_intr.dot(to_extrinsics)
|
||||
warped_quadrangle_full = np.einsum('jk,ik->ij', to_KE, np.hstack((quadrangle_world, np.ones((4,1)))))
|
||||
warped_quadrangle = np.column_stack((warped_quadrangle_full[:,0]/warped_quadrangle_full[:,2],
|
||||
warped_quadrangle_full[:,1]/warped_quadrangle_full[:,2])).astype(np.float32)
|
||||
M = cv2.getPerspectiveTransform(quadrangle, warped_quadrangle.astype(np.float32))
|
||||
|
||||
cy = from_intr[1,2]
|
||||
def get_M(h=1.22):
|
||||
quadrangle = np.array([[0, cy + 20],
|
||||
[size[1]-1, cy + 20],
|
||||
[0, size[0]-1],
|
||||
[size[1]-1, size[0]-1]], dtype=np.float32)
|
||||
quadrangle_norm = np.hstack((normalize(quadrangle, intrinsics=from_intr), np.ones((4,1))))
|
||||
quadrangle_world = np.column_stack((h*quadrangle_norm[:,0]/quadrangle_norm[:,1],
|
||||
h*np.ones(4),
|
||||
h/quadrangle_norm[:,1]))
|
||||
rot = orient.rot_from_euler(augment_eulers)
|
||||
if calib_rot_view is not None:
|
||||
rot = calib_rot_view.dot(rot)
|
||||
to_extrinsics = np.hstack((rot.T, -augment_trans[:,None]))
|
||||
to_KE = to_intr.dot(to_extrinsics)
|
||||
warped_quadrangle_full = np.einsum('jk,ik->ij', to_KE, np.hstack((quadrangle_world, np.ones((4,1)))))
|
||||
warped_quadrangle = np.column_stack((warped_quadrangle_full[:,0]/warped_quadrangle_full[:,2],
|
||||
warped_quadrangle_full[:,1]/warped_quadrangle_full[:,2])).astype(np.float32)
|
||||
M = cv2.getPerspectiveTransform(quadrangle, warped_quadrangle.astype(np.float32))
|
||||
return M
|
||||
|
||||
M = get_M()
|
||||
if pretransform is not None:
|
||||
M = M.dot(pretransform)
|
||||
augmented_rgb = cv2.warpPerspective(base_img, M, output_size, borderMode=cv2.BORDER_REPLICATE)
|
||||
|
||||
if top_hacks:
|
||||
cyy = int(math.ceil(to_intr[1,2]))
|
||||
M = get_M(1000)
|
||||
if pretransform is not None:
|
||||
M = M.dot(pretransform)
|
||||
augmented_rgb[:cyy] = cv2.warpPerspective(base_img, M, (output_size[0], cyy), borderMode=cv2.BORDER_REPLICATE)
|
||||
|
||||
return augmented_rgb
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import numpy as np
|
||||
|
||||
from common.transformations.camera import eon_focal_length, \
|
||||
vp_from_ke, \
|
||||
get_view_frame_from_road_frame, \
|
||||
FULL_FRAME_SIZE
|
||||
vp_from_ke, \
|
||||
get_view_frame_from_road_frame, \
|
||||
FULL_FRAME_SIZE
|
||||
|
||||
# segnet
|
||||
|
||||
|
@ -32,7 +32,7 @@ model_intrinsics = np.array(
|
|||
|
||||
|
||||
# MED model
|
||||
MEDMODEL_INPUT_SIZE = (640, 240)
|
||||
MEDMODEL_INPUT_SIZE = (512, 256)
|
||||
MEDMODEL_YUV_SIZE = (MEDMODEL_INPUT_SIZE[0], MEDMODEL_INPUT_SIZE[1] * 3 // 2)
|
||||
MEDMODEL_CY = 47.6
|
||||
|
||||
|
|
|
@ -19,6 +19,8 @@ function launch {
|
|||
echo 0-3 > /dev/cpuset/foreground/cpus
|
||||
echo 0-3 > /dev/cpuset/android/cpus
|
||||
|
||||
# handle pythonpath
|
||||
ln -s /data/openpilot /data/pythonpath
|
||||
export PYTHONPATH="$PWD"
|
||||
|
||||
# start manager
|
||||
|
|
Binary file not shown.
|
@ -31,6 +31,8 @@ NS_ :
|
|||
BU_BO_REL_
|
||||
SG_MUL_VAL_
|
||||
|
||||
BS_:
|
||||
|
||||
BU_: XXX
|
||||
|
||||
|
||||
|
|
|
@ -31,6 +31,8 @@ NS_ :
|
|||
BU_BO_REL_
|
||||
SG_MUL_VAL_
|
||||
|
||||
BS_:
|
||||
|
||||
BU_: XXX
|
||||
|
||||
|
||||
|
|
|
@ -31,6 +31,8 @@ NS_ :
|
|||
BU_BO_REL_
|
||||
SG_MUL_VAL_
|
||||
|
||||
BS_:
|
||||
|
||||
BU_: XXX
|
||||
|
||||
BO_ 1280 Object_00: 8 XXX
|
||||
|
|
|
@ -31,6 +31,8 @@ NS_ :
|
|||
BU_BO_REL_
|
||||
SG_MUL_VAL_
|
||||
|
||||
BS_:
|
||||
|
||||
BU_: XXX
|
||||
|
||||
BO_ 130 EPAS_INFO: 8 XXX
|
||||
|
@ -128,9 +130,10 @@ BO_ 984 Lane_Keep_Assist_Ui: 8 XXX
|
|||
SG_ Hands_Warning : 49|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ Set_Me_X30 : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
CM_ SG_ 970 Lkas_Action "only vals 4, 5, 8, 9 seem to work. 4 and 5 are a bit smoother" ;
|
||||
|
||||
VAL_ 357 Cruise_State 4 "active" 3 "standby" 0 "off" ;
|
||||
VAL_ 970 Lkas_Action 15 "off" 9 "abrupt" 8 "abrupt2" 5 "smooth" 4 "smooth2" ;
|
||||
VAL_ 970 Lkas_Alert 15 "no_alert" 3 "high_intensity" 2 "mid_intensity" 1 "low_intensity" ;
|
||||
VAL_ 972 LaActAvail_D_Actl 3 "available" 2 "tbd" 1 "not_available" 0 "fault" ;
|
||||
VAL_ 984 Lines_Hud 15 "none" 11 "grey_yellow" 8 "green_red" 7 "yellow_grey" 6 "grey_grey" 4 "red_green" 3 "green_green" ;
|
||||
CM_ SG_ 970 Lkas_Action "only vals 4, 5, 8, 9 seem to work. 4 and 5 are a bit smoother" ;
|
||||
|
|
|
@ -50,6 +50,9 @@ BO_ 450 EPB_STATUS: 8 EPB
|
|||
SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
|
||||
SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
|
||||
|
||||
BO_ 493 HUD_SETTING: 8 XXX
|
||||
SG_ SPEED_UNIT : 5|1@0+ (1,0) [0|1] "" EON
|
||||
|
||||
BO_ 487 BRAKE_PRESSURE: 4 VSA
|
||||
SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
|
||||
SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
|
||||
|
@ -125,6 +128,7 @@ VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_spe
|
|||
VAL_ 401 GEAR_SHIFTER 32 "L" 16 "S" 8 "D" 4 "N" 2 "R" 1 "P" ;
|
||||
VAL_ 401 GEAR 7 "L" 10 "S" 4 "D" 3 "N" 2 "R" 1 "P" ;
|
||||
VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
|
||||
VAL_ 493 SPEED_UNIT 1 "mph" 0 "kph" ;
|
||||
VAL_ 545 ECON_ON_2 0 "off" 3 "on" ;
|
||||
VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
|
||||
VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
|
||||
|
|
|
@ -254,9 +254,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -23,6 +23,7 @@ BO_ 610 EPS_STATUS: 5 EPS
|
|||
|
||||
BO_ 956 GEAR_PACKET: 8 XXX
|
||||
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
|
||||
SG_ SPORT_ON : 3|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
CM_ SG_ 548 BRAKE_PRESSURE "seems prop to pedal force";
|
||||
CM_ SG_ 548 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
|
||||
|
|
|
@ -288,6 +288,9 @@ BO_ 450 EPB_STATUS: 8 EPB
|
|||
SG_ COUNTER : 61|2@0+ (1,0) [0|3] "" EON
|
||||
SG_ CHECKSUM : 59|4@0+ (1,0) [0|3] "" EON
|
||||
|
||||
BO_ 493 HUD_SETTING: 8 XXX
|
||||
SG_ SPEED_UNIT : 5|1@0+ (1,0) [0|1] "" EON
|
||||
|
||||
BO_ 487 BRAKE_PRESSURE: 4 VSA
|
||||
SG_ BRAKE_PRESSURE1 : 7|10@0+ (0.015625,-103) [0|1000] "" EON
|
||||
SG_ BRAKE_PRESSURE2 : 9|10@0+ (0.015625,-103) [0|1000] "" EON
|
||||
|
@ -363,6 +366,7 @@ VAL_ 399 STEER_STATUS 6 "tmp_fault" 5 "fault_1" 4 "no_torque_alert_2" 3 "low_spe
|
|||
VAL_ 401 GEAR_SHIFTER 32 "L" 16 "S" 8 "D" 4 "N" 2 "R" 1 "P" ;
|
||||
VAL_ 401 GEAR 7 "L" 10 "S" 4 "D" 3 "N" 2 "R" 1 "P" ;
|
||||
VAL_ 450 EPB_STATE 3 "engaged" 2 "disengaging" 1 "engaging" 0 "disengaged" ;
|
||||
VAL_ 493 SPEED_UNIT 1 "mph" 0 "kph" ;
|
||||
VAL_ 545 ECON_ON_2 0 "off" 3 "on" ;
|
||||
VAL_ 662 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
|
||||
VAL_ 662 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
|
||||
|
|
|
@ -409,6 +409,7 @@ BO_TX_BU_ 862 : NEO,ADAS;
|
|||
BO_TX_BU_ 927 : NEO,ADAS;
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 330 STEER_ANGLE STEER_ANGLE 0.36 180; CHFFR_METRIC 380 ENGINE_RPM ENGINE_RPM 1 0; CHFFR_METRIC 804 ENGINE_TEMPERATURE ENGINE_TEMPERATURE 1 0";
|
||||
CM_ SG_ 401 GEAR "10 = reverse, 11 = transition";
|
||||
CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
|
||||
CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
|
||||
|
@ -430,4 +431,3 @@ VAL_ 806 CMBS_BUTTON 3 "pressed" 0 "released" ;
|
|||
VAL_ 829 BEEP 3 "single_beep" 2 "triple_beep" 1 "repeated_beep" 0 "no_beep" ;
|
||||
VAL_ 891 WIPERS 4 "High" 2 "Low" 0 "Off" ;
|
||||
VAL_ 927 ACC_ALERTS 29 "esp_active_acc_canceled" 10 "b_pedal_applied" 9 "speed_too_low" 8 "speed_too_high" 7 "p_brake_applied" 6 "gear_no_d" 5 "seatbelt" 4 "too_steep_downhill" 3 "too_steep_uphill" 2 "too_close" 1 "no_vehicle_ahead" ;
|
||||
CM_ "CHFFR_METRIC 330 STEER_ANGLE STEER_ANGLE 0.36 180; CHFFR_METRIC 380 ENGINE_RPM ENGINE_RPM 1 0; CHFFR_METRIC 804 ENGINE_TEMPERATURE ENGINE_TEMPERATURE 1 0";
|
||||
|
|
|
@ -276,6 +276,7 @@ BO_ 1302 ODOMETER: 8 XXX
|
|||
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 342 STEER_ANGLE STEER_ANGLE 0.36 180; CHFFR_METRIC 380 ENGINE_RPM ENGINE_RPM 1 0; CHFFR_METRIC 804 ENGINE_TEMPERATURE ENGINE_TEMPERATURE 1 0";
|
||||
CM_ SG_ 490 LONG_ACCEL "wheel speed derivative, noisy and zero snapping";
|
||||
CM_ SG_ 773 PASS_AIRBAG_OFF "Might just be indicator light";
|
||||
CM_ SG_ 773 PASS_AIRBAG_ON "Might just be indicator light";
|
||||
|
@ -295,4 +296,3 @@ VAL_ 401 GEAR 7 "L" 10 "S" 4 "D" 3 "N" 2 "R" 1 "P" ;
|
|||
VAL_ 422 CRUISE_BUTTONS 7 "tbd" 6 "tbd" 5 "tbd" 4 "accel_res" 3 "decel_set" 2 "cancel" 1 "main" 0 "none" ;
|
||||
VAL_ 422 LIGHTS_SETTING 3 "high_beam" 2 "low_beam" 1 "position" 0 "no_lights" ;
|
||||
VAL_ 422 CRUISE_SETTING 3 "distance_adj" 2 "tbd" 1 "lkas_button" 0 "none" ;
|
||||
CM_ "CHFFR_METRIC 342 STEER_ANGLE STEER_ANGLE 0.36 180; CHFFR_METRIC 380 ENGINE_RPM ENGINE_RPM 1 0; CHFFR_METRIC 804 ENGINE_TEMPERATURE ENGINE_TEMPERATURE 1 0";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -15,16 +15,18 @@ BO_ 359 STEERING_IPAS_COMMA: 8 IPAS
|
|||
CM BO_ STEERING_IPAS_COMMA "Copy of msg 614 so we can do angle control while the Park Assist ECU is connected (Panda spoofs 614 with 359 on connector J70). Note that addresses 0x266 and 0x167 are checksum-invariant";
|
||||
|
||||
BO_ 512 GAS_COMMAND: 6 EON
|
||||
SG_ GAS_COMMAND : 7|16@0+ (0.0244140625,0) [0|1] "" INTERCEPTOR
|
||||
SG_ GAS_COMMAND2 : 23|16@0+ (0.0244140625,-11.962890625) [0|1] "" INTERCEPTOR
|
||||
SG_ GAS_COMMAND : 7|16@0+ (0.159375,-75.555) [0|1] "" INTERCEPTOR
|
||||
SG_ GAS_COMMAND2 : 23|16@0+ (0.159375,-151.111) [0|1] "" INTERCEPTOR
|
||||
SG_ ENABLE : 39|1@0+ (1,0) [0|1] "" INTERCEPTOR
|
||||
SG_ CHECKSUM : 47|8@0+ (1,0) [0|3] "" INTERCEPTOR
|
||||
SG_ COUNTER_PEDAL : 35|4@0+ (1,0) [0|15] "" INTERCEPTOR
|
||||
SG_ CHECKSUM_PEDAL : 47|8@0+ (1,0) [0|255] "" INTERCEPTOR
|
||||
|
||||
BO_ 513 GAS_SENSOR: 6 INTERCEPTOR
|
||||
SG_ INTERCEPTOR_GAS : 7|16@0+ (0.0244140625,0) [0|1] "" EON
|
||||
SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.0244140625,-11.962890625) [0|1] "" EON
|
||||
SG_ STATE : 39|8@0+ (1,0) [0|255] "" EON
|
||||
SG_ CHECKSUM : 47|8@0+ (1,0) [0|3] "" EON
|
||||
SG_ INTERCEPTOR_GAS : 7|16@0+ (0.159375,-75.555) [0|1] "" EON
|
||||
SG_ INTERCEPTOR_GAS2 : 23|16@0+ (0.159375,-151.111) [0|1] "" EON
|
||||
SG_ STATE : 39|4@0+ (1,0) [0|15] "" EON
|
||||
SG_ COUNTER_PEDAL : 35|4@0+ (1,0) [0|15] "" EON
|
||||
SG_ CHECKSUM_PEDAL : 47|8@0+ (1,0) [0|255] "" EON
|
||||
|
||||
VAL_ 513 STATE 5 "FAULT_TIMEOUT" 4 "FAULT_STARTUP" 3 "FAULT_SCE" 2 "FAULT_SEND" 1 "FAULT_BAD_CHECKSUM" 0 "NO_FAULT" ;
|
||||
|
||||
|
@ -76,7 +78,7 @@ BO_ 37 STEER_ANGLE_SENSOR: 8 XXX
|
|||
SG_ STEER_ANGLE : 3|12@0- (1.5,0) [-500|500] "deg" XXX
|
||||
SG_ STEER_FRACTION : 39|4@0- (0.1,0) [-0.7|0.7] "deg" XXX
|
||||
SG_ STEER_RATE : 35|12@0- (1,0) [-2000|2000] "deg/s" XXX
|
||||
|
||||
|
||||
BO_ 166 BRAKE: 8 XXX
|
||||
SG_ BRAKE_AMOUNT : 7|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ BRAKE_PEDAL : 23|8@0+ (1,0) [0|255] "" XXX
|
||||
|
@ -92,6 +94,9 @@ BO_ 180 SPEED: 8 XXX
|
|||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SPEED : 47|16@0+ (0.01,0) [0|250] "kph" XXX
|
||||
|
||||
BO_ 353 DSU_SPEED: 8 XXX
|
||||
SG_ FORWARD_SPEED : 15|16@0- (0.00390625,-30) [0|255] "kph" XXX
|
||||
|
||||
BO_ 466 PCM_CRUISE: 8 XXX
|
||||
SG_ GAS_RELEASED : 4|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ CRUISE_ACTIVE : 5|1@0+ (1,0) [0|1] "" XXX
|
||||
|
@ -140,7 +145,10 @@ BO_ 742 LEAD_INFO: 8 DSU
|
|||
|
||||
BO_ 835 ACC_CONTROL: 8 DSU
|
||||
SG_ ACCEL_CMD : 7|16@0- (0.001,0) [-20|20] "m/s2" HCU
|
||||
SG_ SET_ME_X63 : 23|8@0+ (1,0) [0|255] "" HCU
|
||||
SG_ SET_ME_X01 : 23|2@0+ (1,0) [0|3] "" HCU
|
||||
SG_ DISTANCE : 20|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ MINI_CAR : 21|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_X3 : 19|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ SET_ME_1 : 30|1@0+ (1,0) [0|1] "" HCU
|
||||
SG_ RELEASE_STANDSTILL : 31|1@0+ (1,0) [0|1] "" HCU
|
||||
SG_ CANCEL_REQ : 24|1@0+ (1,0) [0|1] "" HCU
|
||||
|
@ -180,7 +188,7 @@ BO_ 1042 LKAS_HUD: 8 XXX
|
|||
|
||||
BO_ 1553 UI_SEETING: 8 XXX
|
||||
SG_ UNITS : 26|2@0+ (1,0) [0|3] "" XXX
|
||||
|
||||
|
||||
BO_ 1556 STEERING_LEVERS: 8 XXX
|
||||
SG_ TURN_SIGNALS : 29|2@0+ (1,0) [0|3] "" XXX
|
||||
|
||||
|
@ -224,7 +232,7 @@ BO_ 1162 RSA2: 8 FCM
|
|||
SG_ SPDUNT : 63|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSRWMSG : 61|2@0+ (1,0) [0|0] "" XXX
|
||||
SG_ SYNCID2 : 59|4@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
|
||||
BO_ 1163 RSA3: 8 FCM
|
||||
SG_ TSREQPD : 7|1@0+ (1,0) [0|0] "" XXX
|
||||
SG_ TSRMSW : 6|1@0+ (1,0) [0|0] "" XXX
|
||||
|
@ -274,15 +282,15 @@ VAL_ 614 DIRECTION_CMD 3 "right" 2 "center" 1 "left";
|
|||
VAL_ 921 CRUISE_CONTROL_STATE 2 "disabled" 11 "hold" 10 "hold_waiting_user_cmd" 6 "enabled" 5 "faulted";
|
||||
VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none";
|
||||
VAL_ 1042 BARRIERS 3 "both" 2 "right" 1 "left" 0 "none";
|
||||
VAL_ 1042 RIGHT_LINE 3 "orange" 2 "double" 1 "solid" 0 "none";
|
||||
VAL_ 1042 LEFT_LINE 3 "orange" 2 "double" 1 "solid" 0 "none";
|
||||
VAL_ 1042 RIGHT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
|
||||
VAL_ 1042 LEFT_LINE 3 "orange" 2 "faded" 1 "solid" 0 "none";
|
||||
VAL_ 1553 UNITS 1 "km" 2 "miles";
|
||||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -247,7 +247,7 @@ BO_ 1277 NEW_MSG_10: 8 XXX
|
|||
SG_ NEW_SIGNAL_2 : 15|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ counter : 7|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 1275 2017_5: 8 XXX
|
||||
BO_ 1275 MSG_2017_5: 8 XXX
|
||||
SG_ counter : 4|5@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 1274 NEW_MSG_12: 8 XXX
|
||||
|
@ -565,23 +565,23 @@ BO_ 121 EPB: 8 XXX
|
|||
SG_ NEW_SIGNAL_11 : 45|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ EPB_ACTIVE : 29|1@0+ (1,0) [0|15] "" XXX
|
||||
|
||||
BO_ 1070 2017_1: 8 XXX
|
||||
BO_ 1070 MSG_2017_1: 8 XXX
|
||||
|
||||
BO_ 1183 2017_2: 8 XXX
|
||||
BO_ 1183 MSG_2017_2: 8 XXX
|
||||
|
||||
BO_ 1243 2017_3: 8 XXX
|
||||
BO_ 1243 MSG_2017_3: 8 XXX
|
||||
SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX
|
||||
|
||||
BO_ 1269 MSG_2017_4: 8 XXX
|
||||
SG_ NEW_SIGNAL_1 : 55|16@0+ (1,0) [0|18446744073709552000] "" XXX
|
||||
|
||||
BO_ 1178 2017_6: 8 XXX
|
||||
BO_ 1178 MSG_2017_6: 8 XXX
|
||||
SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX
|
||||
|
||||
BO_ 1179 2017_7: 8 XXX
|
||||
BO_ 1179 MSG_2017_7: 8 XXX
|
||||
SG_ NEW_SIGNAL_1 : 7|64@0+ (1,0) [0|18446744073709552000] "" XXX
|
||||
|
||||
BO_ 1435 2017_8: 8 XXX
|
||||
BO_ 1435 MSG_2017_8: 8 XXX
|
||||
|
||||
BO_ 253 NEW_MSG_7: 8 XXX
|
||||
SG_ NEW_SIGNAL_1 : 16|1@0+ (1,0) [0|65535] "" XXX
|
||||
|
|
|
@ -48,7 +48,7 @@ BO_ 64 Throttle: 8 XXX
|
|||
SG_ NEW_SIGNAL_3 : 56|4@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Engine_RPM : 16|12@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Throttle_Cruise : 40|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Throttle_Combo : 55|8@1+ (0.392157,0) [0|255] "" XXX
|
||||
SG_ Throttle_Combo : 55|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Throttle_Pedal : 32|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
|
||||
|
@ -70,12 +70,14 @@ BO_ 72 NEW_MSG_2: 8 XXX
|
|||
|
||||
BO_ 316 NEW_MSG_3: 8 XXX
|
||||
|
||||
BO_ 326 NEW_MSG_4: 8 XXX
|
||||
BO_ 326 Cruise_Buttons: 8 XXX
|
||||
SG_ Checksum : 0|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 16|12@1+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 32|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 40|2@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Signal1 : 12|30@1+ (1,0) [0|1073741823] "" XXX
|
||||
SG_ Main : 42|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ set : 43|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Resume : 44|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Signal2 : 45|19@1+ (1,0) [0|524287] "" XXX
|
||||
|
||||
BO_ 315 G_Sensor: 8 XXX
|
||||
SG_ longitudinal : 63|8@0- (1,0) [0|255] "" XXX
|
||||
|
@ -140,19 +142,10 @@ BO_ 544 ES_Brake: 8 XXX
|
|||
BO_ 545 ES_Distance: 8 XXX
|
||||
SG_ Checksum : 0|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ Close_Distance : 40|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Distance_Swap : 37|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_5 : 39|1@1+ (1,0) [0|31] "" XXX
|
||||
SG_ NEW_SIGNAL_9 : 38|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_4 : 34|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ Brake_Pedal : 33|1@1+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_10 : 35|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ Throttle : 16|12@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 31|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ SET_1 : 12|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ ACC_ENABLE_BTN : 56|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ Car_Follow : 32|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ Brake : 36|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ Signal1 : 12|20@1+ (1,0) [0|15] "" XXX
|
||||
SG_ Signal2 : 32|24@1+ (1,0) [0|15] "" XXX
|
||||
SG_ Main : 56|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Signal3 : 57|7@1+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 546 ES_Status: 8 XXX
|
||||
SG_ Checksum : 0|8@1+ (1,0) [0|255] "" XXX
|
||||
|
@ -225,19 +218,20 @@ BO_ 802 ES_LKAS_State: 8 XXX
|
|||
SG_ Counter : 8|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ Keep_Hands_On_Wheel : 12|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Empty_Box : 13|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Signal1 : 14|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ LKAS_ACTIVE : 17|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ Signal2 : 18|5@1+ (1,0) [0|7] "" XXX
|
||||
SG_ Backward_Speed_Limit_Menu : 23|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ LKAS_ENABLE_3 : 24|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Signal3 : 25|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ LKAS_ENABLE_2 : 26|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_7 : 28|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 30|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ Signal4 : 27|5@1+ (1,0) [0|1] "" XXX
|
||||
SG_ FCW_Cont_Beep : 32|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ FCW_Repeated_Beep : 33|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Throttle_Management_Activated : 34|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Traffic_light_Ahead : 35|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ Right_Depart : 36|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_4 : 44|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_5 : 56|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ Signal5 : 37|27@1+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 805 ES_NEW_MSG_22: 8 XXX
|
||||
SG_ Checksum : 0|8@1+ (1,0) [0|255] "" XXX
|
||||
|
|
|
@ -33,7 +33,7 @@ NS_ :
|
|||
|
||||
BS_:
|
||||
|
||||
BU_: XXX 0
|
||||
BU_: XXX
|
||||
|
||||
|
||||
BO_ 2 Steering: 8 XXX
|
||||
|
@ -211,24 +211,24 @@ BO_ 358 ES_Status: 8 XXX
|
|||
SG_ NEW_SIGNAL_5_Blank : 33|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_4_Blank : 34|1@1+ (1,0) [0|7] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 35|1@0+ (1,0) [0|31] "" XXX
|
||||
SG_ 3SecondDisengage : 13|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ Sig3SecondDisengage : 13|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ Not_Ready_Startup : 0|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ Steep_Hill_Disengage : 44|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ Disengage_Alert : 15|2@0+ (1,0) [0|3] "" XXX
|
||||
|
||||
BO_ 359 ES_LDW: 8 XXX
|
||||
SG_ 2Right_Depart : 50|1@1+ (1,0) [0|7] "" XXX
|
||||
SG_ 2All_Depart : 28|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ 3All_Depart : 52|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ Sig2Right_Depart : 50|1@1+ (1,0) [0|7] "" XXX
|
||||
SG_ Sig2All_Depart : 28|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ Sig3All_Depart : 52|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ Left_Depart_Front : 51|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ All_depart_2015 : 0|1@1+ (1,0) [0|255] "" XXX
|
||||
SG_ LKAS_Inactive_2017 : 36|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ LKAS_Steer_Active_2017 : 37|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ Right_Line_2017 : 24|1@1+ (1,0) [0|7] "" XXX
|
||||
SG_ Left_Line_2017 : 25|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ 1All_Depart : 31|1@0+ (1,0) [0|15] "" XXX
|
||||
SG_ 1Right_Depart_Front : 49|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ 1Right_Depart : 48|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ Sig1All_Depart : 31|1@0+ (1,0) [0|15] "" XXX
|
||||
SG_ Sig1Right_Depart_Front : 49|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ Sig1Right_Depart : 48|1@1+ (1,0) [0|3] "" XXX
|
||||
|
||||
BO_ 392 Counter_0: 8 XXX
|
||||
SG_ Counter : 16|4@1+ (1,0) [0|15] "" XXX
|
||||
|
@ -350,15 +350,15 @@ CM_ SG_ 353 Brake_On "long activatedish";
|
|||
CM_ SG_ 354 RPM "20hz version of Transmission_Engine under Transmission";
|
||||
CM_ SG_ 358 Cruise_Activated "is 1 when cruise is able to go";
|
||||
CM_ SG_ 358 Car_Follow "front car detected";
|
||||
CM_ SG_ 358 3SecondDisengage "seatbelt disengage";
|
||||
CM_ SG_ 358 Sig3SecondDisengage "seatbelt disengage";
|
||||
CM_ SG_ 358 Disengage_Alert "seatbelt and steep hill disengage";
|
||||
CM_ SG_ 359 2All_Depart "Left and right depart";
|
||||
CM_ SG_ 359 Sig2All_Depart "Left and right depart";
|
||||
CM_ SG_ 359 Left_Depart_Front "warning after acceleration into car in front and left depart";
|
||||
CM_ SG_ 359 All_depart_2015 "always 1 on 2017";
|
||||
CM_ SG_ 359 LKAS_Inactive_2017 "1 when not steering, 0 when lkas steering";
|
||||
CM_ SG_ 359 1All_Depart "Left and right depart";
|
||||
CM_ SG_ 359 1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert ";
|
||||
CM_ SG_ 359 1Right_Depart "right depart, hill steep and seatbelt disengage";
|
||||
CM_ SG_ 359 Sig1All_Depart "Left and right depart";
|
||||
CM_ SG_ 359 Sig1Right_Depart_Front "object in front, right depart, hill steep and seatbelt disengage alert ";
|
||||
CM_ SG_ 359 Sig1Right_Depart "right depart, hill steep and seatbelt disengage";
|
||||
CM_ SG_ 642 Counter "Affected by signals";
|
||||
CM_ SG_ 642 RIGHT_BLINKER "0 off, 2 right, 1 left";
|
||||
CM_ SG_ 880 Steering_Voltage_Flat "receives later than 371";
|
||||
|
|
|
@ -307,6 +307,8 @@ BO_ 840 GTW_status: 8 GTW
|
|||
SG_ GTW_statusChecksum : 63|8@0+ (1,0) [0|255] "" NEO
|
||||
SG_ GTW_statusCounter : 51|4@0+ (1,0) [0|15] "" NEO
|
||||
|
||||
CM_ "CHFFR_METRIC 1160 DAS_steeringAngleRequest STEER_ANGLE 0.1098666 180; CHFFR_METRIC 264 DI_motorRPM ENGINE_RPM 1 0";
|
||||
|
||||
VAL_ 3 StW_Angl 16383 "SNA" ;
|
||||
VAL_ 3 StW_AnglSens_Id 2 "MUST" 0 "PSBL" 1 "SELF" ;
|
||||
VAL_ 3 StW_AnglSens_Stat 2 "ERR" 3 "ERR_INI" 1 "INI" 0 "OK" ;
|
||||
|
@ -417,5 +419,3 @@ VAL_ 904 MCU_clusterReadyForDrive 0 "NO_SNA" 1 "YES" ;
|
|||
VAL_ 1160 DAS_steeringAngleRequest 16384 "ZERO_ANGLE" ;
|
||||
VAL_ 1160 DAS_steeringControlType 1 "ANGLE_CONTROL" 3 "DISABLED" 0 "NONE" 2 "RESERVED" ;
|
||||
VAL_ 1160 DAS_steeringHapticRequest 1 "ACTIVE" 0 "IDLE" ;
|
||||
|
||||
CM_ "CHFFR_METRIC 1160 DAS_steeringAngleRequest STEER_ANGLE 0.1098666 180; CHFFR_METRIC 264 DI_motorRPM ENGINE_RPM 1 0";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
@ -321,6 +321,7 @@ BO_ 610 EPS_STATUS: 5 EPS
|
|||
|
||||
BO_ 956 GEAR_PACKET: 8 XXX
|
||||
SG_ GEAR : 13|6@0+ (1,0) [0|63] "" XXX
|
||||
SG_ SPORT_ON : 3|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
CM_ SG_ 548 BRAKE_PRESSURE "seems prop to pedal force";
|
||||
CM_ SG_ 548 BRAKE_POSITION "seems proportional to pedal displacement, unclear the max value of 0x1c8";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -169,6 +169,7 @@ BO_ 452 POWERTRAIN: 8 XXX
|
|||
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
CM_ SG_ 36 ACCEL_Y "unit is tbd";
|
||||
CM_ SG_ 36 STEERING_TORQUE "does not seem the steer torque, tbd";
|
||||
CM_ SG_ 36 YAW_RATE "verify";
|
||||
|
@ -200,4 +201,3 @@ VAL_ 1042 RIGHT_LINE 3 "orange" 2 "double" 1 "solid" 0 "none" ;
|
|||
VAL_ 1042 LEFT_LINE 3 "orange" 2 "double" 1 "solid" 0 "none" ;
|
||||
VAL_ 1042 LDA_ALERT 3 "hold with continuous beep" 2 "LDA unavailable" 1 "hold" 0 "none" ;
|
||||
VAL_ 1553 UNITS 1 "km" 2 "miles" ;
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -288,9 +288,9 @@ VAL_ 1553 UNITS 1 "km" 2 "miles";
|
|||
VAL_ 1556 TURN_SIGNALS 3 "none" 2 "right" 1 "left";
|
||||
VAL_ 1161 TSGN1 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 TSGN2 1 "speed sign" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 65 "no overtake" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 5 "rain" 0 "none";
|
||||
VAL_ 1161 SPLSGN2 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
VAL_ 1162 TSGN3 0 "none" 1 "speed sign" 2 "0 unlimited" 7 "unlimited" 16 "highway" 17 "no highway" 18 "motorway" 19 "no motorway" 20 "in city" 21 "outside city" 22 "pedestrian area" 23 "no pedestrian area" 65 "no overtaking left" 66 "no overtaking right" 67 "overtaking allowed again" 129 "no entry";
|
||||
VAL_ 1162 SPLSGN3 15 "conditional blank" 4 "wet road" 5 "rain" 0 "none";
|
||||
|
||||
|
||||
CM_ "CHFFR_METRIC 37 STEER_ANGLE STEER_ANGLE 0.36 180";
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
.git
|
||||
.DS_Store
|
||||
boardesp/esp-open-sdk
|
|
@ -0,0 +1,64 @@
|
|||
FROM ubuntu:16.04
|
||||
ENV PYTHONUNBUFFERED 1
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
autoconf \
|
||||
automake \
|
||||
bash \
|
||||
bison \
|
||||
bzip2 \
|
||||
curl \
|
||||
dfu-util \
|
||||
flex \
|
||||
g++ \
|
||||
gawk \
|
||||
gcc \
|
||||
git \
|
||||
gperf \
|
||||
help2man \
|
||||
iputils-ping \
|
||||
libexpat-dev \
|
||||
libstdc++-arm-none-eabi-newlib \
|
||||
libtool \
|
||||
libtool-bin \
|
||||
libusb-1.0-0 \
|
||||
make \
|
||||
ncurses-dev \
|
||||
network-manager \
|
||||
python-dev \
|
||||
python-serial \
|
||||
sed \
|
||||
texinfo \
|
||||
unrar-free \
|
||||
unzip \
|
||||
wget \
|
||||
build-essential \
|
||||
python-dev \
|
||||
python-pip \
|
||||
screen \
|
||||
vim \
|
||||
wget \
|
||||
wireless-tools
|
||||
|
||||
RUN pip install --upgrade pip==18.0
|
||||
|
||||
COPY requirements.txt /tmp/
|
||||
RUN pip install -r /tmp/requirements.txt
|
||||
|
||||
RUN mkdir -p /home/batman
|
||||
ENV HOME /home/batman
|
||||
|
||||
ENV PYTHONPATH /tmp:$PYTHONPATH
|
||||
|
||||
COPY ./boardesp/get_sdk_ci.sh /tmp/panda/boardesp/
|
||||
|
||||
RUN useradd --system -s /sbin/nologin pandauser
|
||||
RUN mkdir -p /tmp/panda/boardesp/esp-open-sdk
|
||||
RUN chown pandauser /tmp/panda/boardesp/esp-open-sdk
|
||||
USER pandauser
|
||||
RUN cd /tmp/panda/boardesp && ./get_sdk_ci.sh
|
||||
USER root
|
||||
|
||||
COPY ./xx/pandaextra /tmp/pandaextra
|
||||
|
||||
ADD ./panda.tar.gz /tmp/panda
|
|
@ -0,0 +1,55 @@
|
|||
pipeline {
|
||||
agent any
|
||||
environment {
|
||||
AUTHOR = """${sh(
|
||||
returnStdout: true,
|
||||
script: "git --no-pager show -s --format='%an' ${GIT_COMMIT}"
|
||||
).trim()}"""
|
||||
|
||||
DOCKER_IMAGE_TAG = "panda:build-${env.BUILD_ID}"
|
||||
DOCKER_NAME = "panda-test-${env.BUILD_ID}"
|
||||
}
|
||||
stages {
|
||||
stage('Build Docker Image') {
|
||||
steps {
|
||||
timeout(time: 60, unit: 'MINUTES') {
|
||||
script {
|
||||
sh 'git clone --no-checkout --depth 1 git@github.com:commaai/xx.git || true'
|
||||
sh 'cd xx && git fetch origin && git checkout origin/master -- pandaextra && cd ..' // Needed for certs for panda flashing
|
||||
sh 'git archive -v -o panda.tar.gz --format=tar.gz HEAD'
|
||||
dockerImage = docker.build("${env.DOCKER_IMAGE_TAG}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Test Dev Build') {
|
||||
steps {
|
||||
lock(resource: "Pandas", inversePrecedence: true, quantity:1){
|
||||
timeout(time: 60, unit: 'MINUTES') {
|
||||
sh "docker run --name ${env.DOCKER_NAME} --privileged --volume /dev/bus/usb:/dev/bus/usb --volume /var/run/dbus:/var/run/dbus --net host ${env.DOCKER_IMAGE_TAG} bash -c 'cd /tmp/panda; ./run_automated_tests.sh '"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stage('Test EON Build') {
|
||||
steps {
|
||||
lock(resource: "Pandas", inversePrecedence: true, quantity:1){
|
||||
timeout(time: 60, unit: 'MINUTES') {
|
||||
sh "docker cp ${env.DOCKER_NAME}:/tmp/panda/nosetests.xml test_results_dev.xml"
|
||||
sh "touch EON && docker cp EON ${env.DOCKER_NAME}:/EON"
|
||||
sh "docker start -a ${env.DOCKER_NAME}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
post {
|
||||
always {
|
||||
script {
|
||||
sh "docker cp ${env.DOCKER_NAME}:/tmp/panda/nosetests.xml test_results_EON.xml"
|
||||
sh "docker rm ${env.DOCKER_NAME}"
|
||||
}
|
||||
junit "test_results*.xml"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1 +1 @@
|
|||
v1.2.0
|
||||
v1.2.1
|
|
@ -3,6 +3,8 @@
|
|||
#define ALL_CAN_BUT_MAIN_SILENT 0xFE
|
||||
#define ALL_CAN_LIVE 0
|
||||
|
||||
#include "lline_relay.h"
|
||||
|
||||
int can_live = 0, pending_can_live = 0, can_loopback = 0, can_silent = ALL_CAN_SILENT;
|
||||
|
||||
// ********************* instantiate queues *********************
|
||||
|
@ -23,6 +25,11 @@ can_buffer(tx2_q, 0x100)
|
|||
can_ring *can_queues[] = {&can_tx1_q, &can_tx2_q};
|
||||
#endif
|
||||
|
||||
#ifdef PANDA
|
||||
// Forward declare
|
||||
void power_save_reset_timer();
|
||||
#endif
|
||||
|
||||
// ********************* interrupt safe queue *********************
|
||||
|
||||
int can_pop(can_ring *q, CAN_FIFOMailBox_TypeDef *elem) {
|
||||
|
@ -213,7 +220,7 @@ void can_init(uint8_t can_number) {
|
|||
CAN->FMR &= ~(CAN_FMR_FINIT);
|
||||
|
||||
// enable certain CAN interrupts
|
||||
CAN->IER |= CAN_IER_TMEIE | CAN_IER_FMPIE0;
|
||||
CAN->IER |= CAN_IER_TMEIE | CAN_IER_FMPIE0 | CAN_IER_WKUIE;
|
||||
|
||||
switch (can_number) {
|
||||
case 0:
|
||||
|
@ -293,7 +300,6 @@ void can_set_gmlan(int bus) {
|
|||
void can_sce(CAN_TypeDef *CAN) {
|
||||
enter_critical_section();
|
||||
|
||||
can_err_cnt += 1;
|
||||
#ifdef DEBUG
|
||||
if (CAN==CAN1) puts("CAN1: ");
|
||||
if (CAN==CAN2) puts("CAN2: ");
|
||||
|
@ -315,16 +321,32 @@ void can_sce(CAN_TypeDef *CAN) {
|
|||
|
||||
uint8_t can_number = CAN_NUM_FROM_CANIF(CAN);
|
||||
uint8_t bus_number = BUS_NUM_FROM_CAN_NUM(can_number);
|
||||
if (can_autobaud_enabled[bus_number] && (CAN->ESR & CAN_ESR_LEC)) {
|
||||
can_autobaud_speed_increment(can_number);
|
||||
can_set_speed(can_number);
|
||||
|
||||
if (CAN->MSR & CAN_MSR_WKUI) {
|
||||
//Waking from sleep
|
||||
#ifdef DEBUG
|
||||
puts("WAKE\n");
|
||||
#endif
|
||||
set_can_enable(CAN, 1);
|
||||
CAN->MSR &= ~(CAN_MSR_WKUI);
|
||||
CAN->MSR = CAN->MSR;
|
||||
#ifdef PANDA
|
||||
power_save_reset_timer();
|
||||
#endif
|
||||
} else {
|
||||
can_err_cnt += 1;
|
||||
|
||||
|
||||
if (can_autobaud_enabled[bus_number] && (CAN->ESR & CAN_ESR_LEC)) {
|
||||
can_autobaud_speed_increment(can_number);
|
||||
can_set_speed(can_number);
|
||||
}
|
||||
|
||||
// clear current send
|
||||
CAN->TSR |= CAN_TSR_ABRQ0;
|
||||
CAN->MSR &= ~(CAN_MSR_ERRI);
|
||||
CAN->MSR = CAN->MSR;
|
||||
}
|
||||
|
||||
// clear current send
|
||||
CAN->TSR |= CAN_TSR_ABRQ0;
|
||||
CAN->MSR &= ~(CAN_MSR_ERRI);
|
||||
CAN->MSR = CAN->MSR;
|
||||
|
||||
exit_critical_section();
|
||||
}
|
||||
|
||||
|
@ -332,6 +354,9 @@ void can_sce(CAN_TypeDef *CAN) {
|
|||
|
||||
void process_can(uint8_t can_number) {
|
||||
if (can_number == 0xff) return;
|
||||
#ifdef PANDA
|
||||
power_save_reset_timer();
|
||||
#endif
|
||||
|
||||
enter_critical_section();
|
||||
|
||||
|
@ -375,6 +400,13 @@ void process_can(uint8_t can_number) {
|
|||
}
|
||||
|
||||
if (can_pop(can_queues[bus_number], &to_send)) {
|
||||
if (CAN->MCR & CAN_MCR_SLEEP) {
|
||||
set_can_enable(CAN, 1);
|
||||
CAN->MCR &= ~(CAN_MCR_SLEEP);
|
||||
CAN->MCR |= CAN_MCR_INRQ;
|
||||
while((CAN->MSR & CAN_MSR_INAK) != CAN_MSR_INAK);
|
||||
CAN->MCR &= ~(CAN_MCR_INRQ);
|
||||
}
|
||||
can_tx_cnt += 1;
|
||||
// only send if we have received a packet
|
||||
CAN->sTxMailBox[0].TDLR = to_send.RDLR;
|
||||
|
@ -390,6 +422,9 @@ void process_can(uint8_t can_number) {
|
|||
// CAN receive handlers
|
||||
// blink blue when we are receiving CAN messages
|
||||
void can_rx(uint8_t can_number) {
|
||||
#ifdef PANDA
|
||||
power_save_reset_timer();
|
||||
#endif
|
||||
CAN_TypeDef *CAN = CANIF_FROM_CAN_NUM(can_number);
|
||||
uint8_t bus_number = BUS_NUM_FROM_CAN_NUM(can_number);
|
||||
while (CAN->RF0R & CAN_RF0R_FMP0) {
|
||||
|
@ -420,14 +455,16 @@ void can_rx(uint8_t can_number) {
|
|||
|
||||
// forwarding (panda only)
|
||||
#ifdef PANDA
|
||||
int bus_fwd_num = can_forwarding[bus_number] != -1 ? can_forwarding[bus_number] : safety_fwd_hook(bus_number, &to_push);
|
||||
if (bus_fwd_num != -1) {
|
||||
CAN_FIFOMailBox_TypeDef to_send;
|
||||
to_send.RIR = to_push.RIR | 1; // TXRQ
|
||||
to_send.RDTR = to_push.RDTR;
|
||||
to_send.RDLR = to_push.RDLR;
|
||||
to_send.RDHR = to_push.RDHR;
|
||||
can_send(&to_send, bus_fwd_num);
|
||||
if ((get_lline_status() != 0) || !relay_control) { //Relay engaged or relay isn't controlled, allow fwd
|
||||
int bus_fwd_num = can_forwarding[bus_number] != -1 ? can_forwarding[bus_number] : safety_fwd_hook(bus_number, &to_push);
|
||||
if (bus_fwd_num != -1) {
|
||||
CAN_FIFOMailBox_TypeDef to_send;
|
||||
to_send.RIR = to_push.RIR | 1; // TXRQ
|
||||
to_send.RDTR = to_push.RDTR;
|
||||
to_send.RDLR = to_push.RDLR;
|
||||
to_send.RDHR = to_push.RDHR;
|
||||
can_send(&to_send, bus_fwd_num);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -0,0 +1,88 @@
|
|||
#ifdef PANDA
|
||||
|
||||
int relay_control = 0; // True if relay is controlled through l-line
|
||||
|
||||
/* Conrol a relay connected to l-line pin */
|
||||
|
||||
// 160us cycles, 1 high, 25 low
|
||||
|
||||
volatile int turn_on_relay = 0;
|
||||
volatile int on_cycles = 25;
|
||||
|
||||
//5s timeout
|
||||
#define LLINE_TIMEOUT_CYCLES 31250
|
||||
volatile int timeout_cycles = LLINE_TIMEOUT_CYCLES;
|
||||
|
||||
void TIM5_IRQHandler(void) {
|
||||
if (TIM5->SR & TIM_SR_UIF) {
|
||||
on_cycles--;
|
||||
timeout_cycles--;
|
||||
if (timeout_cycles == 0) {
|
||||
turn_on_relay = 0;
|
||||
}
|
||||
if (on_cycles > 0) {
|
||||
if (turn_on_relay) {
|
||||
set_gpio_output(GPIOC, 10, 0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
set_gpio_output(GPIOC, 10, 1);
|
||||
on_cycles = 25;
|
||||
}
|
||||
}
|
||||
TIM5->ARR = 160-1;
|
||||
TIM5->SR = 0;
|
||||
}
|
||||
|
||||
void lline_relay_init (void) {
|
||||
set_lline_output(0);
|
||||
relay_control = 1;
|
||||
set_gpio_output(GPIOC, 10, 1);
|
||||
|
||||
// setup
|
||||
TIM5->PSC = 48-1; // tick on 1 us
|
||||
TIM5->CR1 = TIM_CR1_CEN; // enable
|
||||
TIM5->ARR = 50-1; // 50 us
|
||||
TIM5->DIER = TIM_DIER_UIE; // update interrupt
|
||||
TIM5->CNT = 0;
|
||||
|
||||
NVIC_EnableIRQ(TIM5_IRQn);
|
||||
|
||||
#ifdef DEBUG
|
||||
puts("INIT LLINE\n");
|
||||
puts(" SR ");
|
||||
putui(TIM5->SR);
|
||||
puts(" PSC ");
|
||||
putui(TIM5->PSC);
|
||||
puts(" CR1 ");
|
||||
putui(TIM5->CR1);
|
||||
puts(" ARR ");
|
||||
putui(TIM5->ARR);
|
||||
puts(" DIER ");
|
||||
putui(TIM5->DIER);
|
||||
puts(" SR ");
|
||||
putui(TIM5->SR);
|
||||
puts(" CNT ");
|
||||
putui(TIM5->CNT);
|
||||
puts("\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void lline_relay_release (void) {
|
||||
set_lline_output(0);
|
||||
relay_control = 0;
|
||||
puts("RELEASE LLINE\n");
|
||||
set_gpio_alternate(GPIOC, 10, GPIO_AF7_USART3);
|
||||
NVIC_DisableIRQ(TIM5_IRQn);
|
||||
}
|
||||
|
||||
void set_lline_output(int to_set) {
|
||||
timeout_cycles = LLINE_TIMEOUT_CYCLES;
|
||||
turn_on_relay = to_set;
|
||||
}
|
||||
|
||||
int get_lline_status() {
|
||||
return turn_on_relay;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -120,6 +120,8 @@ void periph_init() {
|
|||
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
|
||||
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
|
||||
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
|
||||
RCC->APB1ENR |= RCC_APB1ENR_TIM5EN;
|
||||
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN;
|
||||
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
|
||||
RCC->AHB2ENR |= RCC_AHB2ENR_OTGFSEN;
|
||||
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
|
||||
|
@ -390,7 +392,9 @@ void gpio_init() {
|
|||
set_gpio_output(GPIOA, 14, 1);
|
||||
|
||||
// C10,C11: L-Line setup on USART 3
|
||||
set_gpio_alternate(GPIOC, 10, GPIO_AF7_USART3);
|
||||
// LLine now used for relay output
|
||||
set_gpio_output(GPIOC, 10, 1);
|
||||
//set_gpio_alternate(GPIOC, 10, GPIO_AF7_USART3);
|
||||
set_gpio_alternate(GPIOC, 11, GPIO_AF7_USART3);
|
||||
set_gpio_pullup(GPIOC, 11, PULL_UP);
|
||||
#endif
|
||||
|
@ -475,4 +479,3 @@ void early() {
|
|||
enter_bootloader_mode = ENTER_SOFTLOADER_MAGIC;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#include "drivers/spi.h"
|
||||
#include "drivers/timer.h"
|
||||
|
||||
#include "power_saving.h"
|
||||
|
||||
|
||||
// ***************************** fan *****************************
|
||||
|
||||
|
@ -141,6 +143,7 @@ void usb_cb_ep2_out(uint8_t *usbdata, int len, int hardwired) {
|
|||
uart_ring *ur = get_ring_by_number(usbdata[0]);
|
||||
if (!ur) return;
|
||||
if ((usbdata[0] < 2) || safety_tx_lin_hook(usbdata[0]-2, usbdata+1, len-1)) {
|
||||
if (ur == &esp_ring) power_save_reset_timer();
|
||||
for (int i = 1; i < len; i++) while (!putc(ur, usbdata[i]));
|
||||
}
|
||||
}
|
||||
|
@ -160,6 +163,14 @@ void usb_cb_ep3_out(uint8_t *usbdata, int len, int hardwired) {
|
|||
|
||||
uint8_t bus_number = (to_push.RDTR >> 4) & CAN_BUS_NUM_MASK;
|
||||
can_send(&to_push, bus_number);
|
||||
|
||||
#ifdef PANDA
|
||||
// Enable relay on can message if allowed.
|
||||
// Temporary until OP has support for relay
|
||||
if (safety_relay_hook()) {
|
||||
set_lline_output(1);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -441,6 +452,16 @@ int usb_cb_control_msg(USB_Setup_TypeDef *setup, uint8_t *resp, int hardwired) {
|
|||
}
|
||||
break;
|
||||
}
|
||||
// **** 0xf3: set l-line relay
|
||||
case 0xf3:
|
||||
{
|
||||
#ifdef PANDA
|
||||
if (safety_relay_hook()) {
|
||||
set_lline_output(setup->b.wValue.w == 1);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
default:
|
||||
puts("NO HANDLER ");
|
||||
puth(setup->b.bRequest);
|
||||
|
@ -572,6 +593,9 @@ int main() {
|
|||
#ifdef PANDA
|
||||
spi_init();
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
puts("DEBUG ENABLED\n");
|
||||
#endif
|
||||
|
||||
// set PWM
|
||||
fan_init();
|
||||
|
@ -581,6 +605,8 @@ int main() {
|
|||
|
||||
__enable_irq();
|
||||
|
||||
power_save_init();
|
||||
|
||||
// if the error interrupt is enabled to quickly when the CAN bus is active
|
||||
// something bad happens and you can't connect to the device over USB
|
||||
delay(10000000);
|
||||
|
|
|
@ -295,6 +295,7 @@ int main() {
|
|||
puts("**** INTERRUPTS ON ****\n");
|
||||
__enable_irq();
|
||||
|
||||
|
||||
// main pedal loop
|
||||
while (1) {
|
||||
pedal();
|
||||
|
@ -302,4 +303,3 @@ int main() {
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,157 @@
|
|||
#define POWER_SAVE_STATUS_DISABLED 0
|
||||
//Moving to enabled, but can wakeup not yet enabled
|
||||
#define POWER_SAVE_STATUS_SWITCHING 1
|
||||
#define POWER_SAVE_STATUS_ENABLED 2
|
||||
|
||||
volatile int power_save_status = POWER_SAVE_STATUS_DISABLED;
|
||||
|
||||
void power_save_enable(void) {
|
||||
power_save_status = POWER_SAVE_STATUS_SWITCHING;
|
||||
puts("Saving power\n");
|
||||
//Turn off can transciever
|
||||
set_can_enable(CAN1, 0);
|
||||
set_can_enable(CAN2, 0);
|
||||
#ifdef PANDA
|
||||
set_can_enable(CAN3, 0);
|
||||
#endif
|
||||
|
||||
//Turn off GMLAN
|
||||
set_gpio_output(GPIOB, 14, 0);
|
||||
set_gpio_output(GPIOB, 15, 0);
|
||||
|
||||
#ifdef PANDA
|
||||
//Turn off LIN K
|
||||
if (revision == PANDA_REV_C) {
|
||||
set_gpio_output(GPIOB, 7, 0); // REV C
|
||||
} else {
|
||||
set_gpio_output(GPIOB, 4, 0); // REV AB
|
||||
}
|
||||
// LIN L
|
||||
set_gpio_output(GPIOA, 14, 0);
|
||||
#endif
|
||||
|
||||
if (is_grey_panda) {
|
||||
char* UBLOX_SLEEP_MSG = "\xb5\x62\x06\x04\x04\x00\x01\x00\x08\x00\x17\x78";
|
||||
int len = 12;
|
||||
uart_ring *ur = get_ring_by_number(1);
|
||||
for (int i = 0; i < len; i++) while (!putc(ur, UBLOX_SLEEP_MSG[i]));
|
||||
}
|
||||
|
||||
//Setup timer for can enable
|
||||
TIM6->PSC = 48-1; // tick on 1 us
|
||||
|
||||
TIM6->ARR = 12; // 12us
|
||||
// Enable, One-Pulse Mode, Only overflow interrupt
|
||||
TIM6->CR1 = TIM_CR1_CEN | TIM_CR1_OPM | TIM_CR1_URS;
|
||||
TIM6->EGR = TIM_EGR_UG;
|
||||
TIM6->CR1 |= TIM_CR1_CEN;
|
||||
}
|
||||
|
||||
void power_save_enable_can_wake(void) {
|
||||
// CAN Automatic Wake must be done a little while after the sleep
|
||||
// On some cars turning off the can transciver can trigger the wakeup
|
||||
power_save_status = POWER_SAVE_STATUS_ENABLED;
|
||||
puts("Turning can off\n");
|
||||
CAN1->MCR |= CAN_MCR_SLEEP;
|
||||
CAN1->MCR |= CAN_MCR_AWUM;
|
||||
|
||||
CAN2->MCR |= CAN_MCR_SLEEP;
|
||||
CAN2->MCR |= CAN_MCR_AWUM;
|
||||
#ifdef PANDA
|
||||
CAN3->MCR |= CAN_MCR_SLEEP;
|
||||
CAN3->MCR |= CAN_MCR_AWUM;
|
||||
#endif
|
||||
|
||||
//set timer back
|
||||
TIM6->PSC = 48000-1; // tick on 1 ms
|
||||
TIM6->ARR = 10000; // 10s
|
||||
// Enable, One-Pulse Mode, Only overflow interrupt
|
||||
TIM6->CR1 = TIM_CR1_OPM | TIM_CR1_URS;
|
||||
TIM6->EGR = TIM_EGR_UG;
|
||||
}
|
||||
|
||||
void power_save_disable(void) {
|
||||
power_save_status = POWER_SAVE_STATUS_DISABLED;
|
||||
puts("not Saving power\n");
|
||||
TIM6->CR1 |= TIM_CR1_CEN; //Restart timer
|
||||
TIM6->CNT = 0;
|
||||
|
||||
//Turn on can
|
||||
set_can_enable(CAN1, 1);
|
||||
set_can_enable(CAN2, 1);
|
||||
|
||||
#ifdef PANDA
|
||||
set_can_enable(CAN3, 1);
|
||||
#endif
|
||||
|
||||
//Turn on GMLAN
|
||||
set_gpio_output(GPIOB, 14, 1);
|
||||
set_gpio_output(GPIOB, 15, 1);
|
||||
|
||||
#ifdef PANDA
|
||||
//Turn on LIN K
|
||||
if (revision == PANDA_REV_C) {
|
||||
set_gpio_output(GPIOB, 7, 1); // REV C
|
||||
} else {
|
||||
set_gpio_output(GPIOB, 4, 1); // REV AB
|
||||
}
|
||||
// LIN L
|
||||
set_gpio_output(GPIOA, 14, 1);
|
||||
#endif
|
||||
|
||||
if (is_grey_panda) {
|
||||
char* UBLOX_WAKE_MSG = "\xb5\x62\x06\x04\x04\x00\x01\x00\x09\x00\x18\x7a";
|
||||
int len = 12;
|
||||
uart_ring *ur = get_ring_by_number(1);
|
||||
for (int i = 0; i < len; i++) while (!putc(ur, UBLOX_WAKE_MSG[i]));
|
||||
}
|
||||
|
||||
//set timer back
|
||||
TIM6->PSC = 48000-1; // tick on 1 ms
|
||||
TIM6->ARR = 10000; // 10s
|
||||
// Enable, One-Pulse Mode, Only overflow interrupt
|
||||
TIM6->CR1 = TIM_CR1_CEN | TIM_CR1_OPM | TIM_CR1_URS;
|
||||
TIM6->EGR = TIM_EGR_UG;
|
||||
TIM6->CR1 |= TIM_CR1_CEN;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Reset timer when activity
|
||||
void power_save_reset_timer() {
|
||||
TIM6->CNT = 0;
|
||||
if (power_save_status != POWER_SAVE_STATUS_DISABLED){
|
||||
power_save_disable();
|
||||
}
|
||||
}
|
||||
|
||||
void power_save_init(void) {
|
||||
puts("Saving power init\n");
|
||||
TIM6->PSC = 48000-1; // tick on 1 ms
|
||||
|
||||
|
||||
TIM6->ARR = 10000; // 10s
|
||||
// Enable, One-Pulse Mode, Only overflow interrupt
|
||||
TIM6->CR1 = TIM_CR1_CEN | TIM_CR1_OPM | TIM_CR1_URS;
|
||||
TIM6->EGR = TIM_EGR_UG;
|
||||
NVIC_EnableIRQ(TIM6_DAC_IRQn);
|
||||
puts("Saving power init done\n");
|
||||
TIM6->DIER = TIM_DIER_UIE;
|
||||
TIM6->CR1 |= TIM_CR1_CEN;
|
||||
}
|
||||
|
||||
void TIM6_DAC_IRQHandler(void) {
|
||||
//Timeout switch to power saving mode.
|
||||
if (TIM6->SR & TIM_SR_UIF) {
|
||||
TIM6->SR = 0;
|
||||
#ifdef EON
|
||||
if (power_save_status == POWER_SAVE_STATUS_DISABLED) {
|
||||
power_save_enable();
|
||||
} else if (power_save_status == POWER_SAVE_STATUS_SWITCHING) {
|
||||
power_save_enable_can_wake();
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
TIM6->CR1 |= TIM_CR1_CEN;
|
||||
}
|
||||
}
|
|
@ -29,6 +29,10 @@ int driver_limit_check(int val, int val_last, struct sample_t *val_driver,
|
|||
int rt_rate_limit_check(int val, int val_last, const int MAX_RT_DELTA);
|
||||
#ifdef PANDA
|
||||
float interpolate(struct lookup_t xy, float x);
|
||||
|
||||
void lline_relay_init (void);
|
||||
void lline_relay_release (void);
|
||||
void set_lline_output(int to_set);
|
||||
#endif
|
||||
|
||||
typedef void (*safety_hook_init)(int16_t param);
|
||||
|
@ -37,6 +41,7 @@ typedef int (*tx_hook)(CAN_FIFOMailBox_TypeDef *to_send);
|
|||
typedef int (*tx_lin_hook)(int lin_num, uint8_t *data, int len);
|
||||
typedef int (*ign_hook)();
|
||||
typedef int (*fwd_hook)(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd);
|
||||
typedef int (*relay_hook)();
|
||||
|
||||
typedef struct {
|
||||
safety_hook_init init;
|
||||
|
@ -45,6 +50,7 @@ typedef struct {
|
|||
tx_hook tx;
|
||||
tx_lin_hook tx_lin;
|
||||
fwd_hook fwd;
|
||||
relay_hook relay;
|
||||
} safety_hooks;
|
||||
|
||||
// This can be set by the safety hooks.
|
||||
|
@ -91,6 +97,10 @@ int safety_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
|||
return current_hooks->fwd(bus_num, to_fwd);
|
||||
}
|
||||
|
||||
int safety_relay_hook(void) {
|
||||
return current_hooks->relay();
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
uint16_t id;
|
||||
const safety_hooks *hooks;
|
||||
|
|
|
@ -115,6 +115,9 @@ static int cadillac_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
|
|||
static void cadillac_init(int16_t param) {
|
||||
controls_allowed = 0;
|
||||
cadillac_ign = 0;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int cadillac_ign_hook() {
|
||||
|
@ -128,4 +131,5 @@ const safety_hooks cadillac_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = cadillac_ign_hook,
|
||||
.fwd = alloutput_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -5,7 +5,7 @@ const int CHRYSLER_MAX_RATE_UP = 3;
|
|||
const int CHRYSLER_MAX_RATE_DOWN = 3;
|
||||
const int CHRYSLER_MAX_TORQUE_ERROR = 80; // max torque cmd in excess of torque motor
|
||||
|
||||
int chrysler_camera_detected = 0;
|
||||
int chrysler_camera_detected = 0; // is giraffe switch 2 high?
|
||||
int chrysler_rt_torque_last = 0;
|
||||
int chrysler_desired_torque_last = 0;
|
||||
int chrysler_cruise_engaged_last = 0;
|
||||
|
@ -125,12 +125,33 @@ static int chrysler_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
|
|||
return true;
|
||||
}
|
||||
|
||||
static void chrysler_init(int16_t param) {
|
||||
chrysler_camera_detected = 0;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int chrysler_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
||||
int32_t addr = to_fwd->RIR >> 21;
|
||||
// forward CAN 0 -> 2 so stock LKAS camera sees messages
|
||||
if (bus_num == 0 && !chrysler_camera_detected) {
|
||||
return 2;
|
||||
}
|
||||
// forward all messages from camera except LKAS_COMMAND and LKAS_HUD
|
||||
if (bus_num == 2 && !chrysler_camera_detected && addr != 658 && addr != 678) {
|
||||
return 0;
|
||||
}
|
||||
return -1; // do not forward
|
||||
}
|
||||
|
||||
|
||||
const safety_hooks chrysler_hooks = {
|
||||
.init = nooutput_init,
|
||||
.init = chrysler_init,
|
||||
.rx = chrysler_rx_hook,
|
||||
.tx = chrysler_tx_hook,
|
||||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = nooutput_fwd_hook,
|
||||
.fwd = chrysler_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -8,6 +8,9 @@ int default_ign_hook() {
|
|||
|
||||
static void nooutput_init(int16_t param) {
|
||||
controls_allowed = 0;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int nooutput_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
|
||||
|
@ -22,6 +25,10 @@ static int nooutput_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int nooutput_relay_hook(int to_set) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const safety_hooks nooutput_hooks = {
|
||||
.init = nooutput_init,
|
||||
.rx = default_rx_hook,
|
||||
|
@ -29,12 +36,16 @@ const safety_hooks nooutput_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = nooutput_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
||||
// *** all output safety mode ***
|
||||
|
||||
static void alloutput_init(int16_t param) {
|
||||
controls_allowed = 1;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int alloutput_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
|
||||
|
@ -49,6 +60,10 @@ static int alloutput_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int alloutput_relay_hook(int to_set) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const safety_hooks alloutput_hooks = {
|
||||
.init = alloutput_init,
|
||||
.rx = default_rx_hook,
|
||||
|
@ -56,4 +71,5 @@ const safety_hooks alloutput_hooks = {
|
|||
.tx_lin = alloutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = alloutput_fwd_hook,
|
||||
.relay = alloutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -42,4 +42,5 @@ const safety_hooks elm327_hooks = {
|
|||
.tx_lin = elm327_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = elm327_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -90,4 +90,5 @@ const safety_hooks ford_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = nooutput_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -228,6 +228,9 @@ static int gm_tx_hook(CAN_FIFOMailBox_TypeDef *to_send) {
|
|||
static void gm_init(int16_t param) {
|
||||
controls_allowed = 0;
|
||||
gm_ignition_started = 0;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int gm_ign_hook() {
|
||||
|
@ -241,5 +244,5 @@ const safety_hooks gm_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = gm_ign_hook,
|
||||
.fwd = nooutput_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
||||
|
|
|
@ -48,5 +48,6 @@ const safety_hooks gm_ascm_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = gm_ascm_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
||||
|
|
|
@ -136,6 +136,9 @@ static void honda_init(int16_t param) {
|
|||
controls_allowed = 0;
|
||||
bosch_hardware = false;
|
||||
honda_alt_brake_msg = false;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void honda_bosch_init(int16_t param) {
|
||||
|
@ -143,6 +146,9 @@ static void honda_bosch_init(int16_t param) {
|
|||
bosch_hardware = true;
|
||||
// Checking for alternate brake override from safety parameter
|
||||
honda_alt_brake_msg = param == 1 ? true : false;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int honda_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
||||
|
@ -176,6 +182,7 @@ const safety_hooks honda_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = honda_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
||||
const safety_hooks honda_bosch_hooks = {
|
||||
|
@ -185,4 +192,5 @@ const safety_hooks honda_bosch_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = honda_bosch_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -152,6 +152,9 @@ static int hyundai_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
|||
static void hyundai_init(int16_t param) {
|
||||
controls_allowed = 0;
|
||||
hyundai_giraffe_switch_2 = 0;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
const safety_hooks hyundai_hooks = {
|
||||
|
@ -161,4 +164,5 @@ const safety_hooks hyundai_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = hyundai_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -14,6 +14,11 @@ int subaru_desired_torque_last = 0;
|
|||
uint32_t subaru_ts_last = 0;
|
||||
struct sample_t subaru_torque_driver; // last few driver torques measured
|
||||
|
||||
static void subaru_init(int16_t param) {
|
||||
#ifdef PANDA
|
||||
lline_relay_init();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void subaru_rx_hook(CAN_FIFOMailBox_TypeDef *to_push) {
|
||||
int bus_number = (to_push->RDTR >> 4) & 0xFF;
|
||||
|
@ -100,6 +105,7 @@ static int subaru_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
|||
|
||||
// forward CAN 0 > 1
|
||||
if (bus_num == 0) {
|
||||
|
||||
return 2; // ES CAN
|
||||
}
|
||||
// forward CAN 1 > 0, except ES_LKAS
|
||||
|
@ -113,6 +119,10 @@ static int subaru_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
|||
if (addr == 0x122) {
|
||||
return -1;
|
||||
}
|
||||
// ES Distance
|
||||
if (addr == 545) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0; // Main CAN
|
||||
}
|
||||
|
@ -122,10 +132,11 @@ static int subaru_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
|||
}
|
||||
|
||||
const safety_hooks subaru_hooks = {
|
||||
.init = nooutput_init,
|
||||
.init = subaru_init,
|
||||
.rx = subaru_rx_hook,
|
||||
.tx = subaru_tx_hook,
|
||||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = subaru_fwd_hook,
|
||||
.relay = alloutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -230,6 +230,9 @@ static void tesla_init(int16_t param)
|
|||
controls_allowed = 0;
|
||||
tesla_ignition_started = 0;
|
||||
gmlan_switch_init(1); //init the gmlan switch with 1s timeout enabled
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int tesla_ign_hook()
|
||||
|
@ -284,4 +287,5 @@ const safety_hooks tesla_hooks = {
|
|||
.tx_lin = tesla_tx_lin_hook,
|
||||
.ignition = tesla_ign_hook,
|
||||
.fwd = tesla_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -160,6 +160,9 @@ static void toyota_init(int16_t param) {
|
|||
toyota_giraffe_switch_1 = 0;
|
||||
toyota_camera_forwarded = 0;
|
||||
toyota_dbc_eps_torque_factor = param;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
static int toyota_fwd_hook(int bus_num, CAN_FIFOMailBox_TypeDef *to_fwd) {
|
||||
|
@ -181,6 +184,7 @@ const safety_hooks toyota_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = toyota_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
||||
static void toyota_nolimits_init(int16_t param) {
|
||||
|
@ -189,6 +193,9 @@ static void toyota_nolimits_init(int16_t param) {
|
|||
toyota_giraffe_switch_1 = 0;
|
||||
toyota_camera_forwarded = 0;
|
||||
toyota_dbc_eps_torque_factor = param;
|
||||
#ifdef PANDA
|
||||
lline_relay_release();
|
||||
#endif
|
||||
}
|
||||
|
||||
const safety_hooks toyota_nolimits_hooks = {
|
||||
|
@ -198,4 +205,5 @@ const safety_hooks toyota_nolimits_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = toyota_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
|
|
@ -152,5 +152,5 @@ const safety_hooks toyota_ipas_hooks = {
|
|||
.tx_lin = nooutput_tx_lin_hook,
|
||||
.ignition = default_ign_hook,
|
||||
.fwd = toyota_fwd_hook,
|
||||
.relay = nooutput_relay_hook,
|
||||
};
|
||||
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
#!/bin/bash
|
||||
git clone --recursive https://github.com/pfalcon/esp-open-sdk.git
|
||||
cd esp-open-sdk
|
||||
git checkout 03f5e898a059451ec5f3de30e7feff30455f7cec
|
||||
LD_LIBRARY_PATH="" make STANDALONE=y
|
|
@ -182,6 +182,7 @@ class Panda(object):
|
|||
traceback.print_exc()
|
||||
if wait == False or self._handle != None:
|
||||
break
|
||||
context = usb1.USBContext() #New context needed so new devices show up
|
||||
assert(self._handle != None)
|
||||
print("connected")
|
||||
|
||||
|
@ -280,11 +281,14 @@ class Panda(object):
|
|||
if reconnect:
|
||||
self.reconnect()
|
||||
|
||||
def recover(self):
|
||||
def recover(self, timeout=None):
|
||||
self.reset(enter_bootloader=True)
|
||||
t_start = time.time()
|
||||
while len(PandaDFU.list()) == 0:
|
||||
print("waiting for DFU...")
|
||||
time.sleep(0.1)
|
||||
if timeout is not None and (time.time() - t_start) > timeout:
|
||||
return False
|
||||
|
||||
dfu = PandaDFU(PandaDFU.st_serial_to_dfu_serial(self._serial))
|
||||
dfu.recover()
|
||||
|
@ -292,6 +296,7 @@ class Panda(object):
|
|||
# reflash after recover
|
||||
self.connect(True, True)
|
||||
self.flash()
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def flash_ota_st():
|
||||
|
@ -300,8 +305,9 @@ class Panda(object):
|
|||
return ret==0
|
||||
|
||||
@staticmethod
|
||||
def flash_ota_wifi():
|
||||
ret = os.system("cd %s && make clean && make ota" % (os.path.join(BASEDIR, "boardesp")))
|
||||
def flash_ota_wifi(release=False):
|
||||
release_str = "RELEASE=1" if release else ""
|
||||
ret = os.system("cd {} && make clean && {} make ota".format(os.path.join(BASEDIR, "boardesp"),release_str))
|
||||
time.sleep(1)
|
||||
return ret==0
|
||||
|
||||
|
@ -386,10 +392,17 @@ class Panda(object):
|
|||
elif bus in [Panda.GMLAN_CAN2, Panda.GMLAN_CAN3]:
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xdb, 1, bus, b'')
|
||||
|
||||
def set_lline_relay(self, enable):
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xf3, int(enable), 0, b'')
|
||||
|
||||
def set_can_loopback(self, enable):
|
||||
# set can loopback mode for all buses
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xe5, int(enable), 0, b'')
|
||||
|
||||
def set_can_enable(self, bus_num, enable):
|
||||
# sets the can transciever enable pin
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xf4, int(bus_num), int(enable), b'')
|
||||
|
||||
def set_can_speed_kbps(self, bus, speed):
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xde, bus, int(speed*10), b'')
|
||||
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
libusb1
|
||||
libusb1 == 1.6.6
|
||||
hexdump
|
||||
pycrypto
|
||||
tqdm
|
||||
nose
|
||||
parameterized
|
||||
requests
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
#!/bin/bash
|
||||
PYTHONPATH="." nosetests -x -s tests/automated/$1*.py
|
||||
TEST_FILENAME=${TEST_FILENAME:-nosetests.xml}
|
||||
if [ ! -f "/EON" ]; then
|
||||
TESTSUITE_NAME="Panda_Test-EON"
|
||||
else
|
||||
TESTSUITE_NAME="Panda_Test-DEV"
|
||||
fi
|
||||
|
||||
PYTHONPATH="." nosetests -v --with-xunit --xunit-file=./$TEST_FILENAME --xunit-testsuite-name=$TESTSUITE_NAME -s tests/automated/$1*.py
|
||||
|
|
|
@ -46,7 +46,7 @@ setup(
|
|||
platforms='any',
|
||||
license='MIT',
|
||||
install_requires=[
|
||||
'libusb1 >= 1.6.4',
|
||||
'libusb1 == 1.6.6',
|
||||
'hexdump >= 3.3',
|
||||
'pycrypto >= 2.6.1',
|
||||
'tqdm >= 4.14.0',
|
||||
|
|
|
@ -1,11 +1,15 @@
|
|||
import os
|
||||
from panda import Panda
|
||||
from helpers import panda_color_to_serial, test_white_and_grey
|
||||
|
||||
def test_recover():
|
||||
p = Panda()
|
||||
p.recover()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_recover(serial=None):
|
||||
p = Panda(serial=serial)
|
||||
assert p.recover(timeout=30)
|
||||
|
||||
def test_flash():
|
||||
p = Panda()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_flash(serial=None):
|
||||
p = Panda(serial=serial)
|
||||
p.flash()
|
||||
|
||||
|
|
|
@ -3,14 +3,16 @@ import os
|
|||
import sys
|
||||
import time
|
||||
from panda import Panda
|
||||
from nose.tools import timed, assert_equal, assert_less, assert_greater
|
||||
from helpers import time_many_sends, connect_wo_esp
|
||||
from nose.tools import assert_equal, assert_less, assert_greater
|
||||
from helpers import time_many_sends, connect_wo_esp, test_white_and_grey, panda_color_to_serial
|
||||
|
||||
SPEED_NORMAL = 500
|
||||
SPEED_GMLAN = 33.3
|
||||
|
||||
def test_can_loopback():
|
||||
p = connect_wo_esp()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_can_loopback(serial=None):
|
||||
p = connect_wo_esp(serial)
|
||||
|
||||
# enable output mode
|
||||
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||
|
@ -42,8 +44,10 @@ def test_can_loopback():
|
|||
assert 0x1aa == sr[0][0] == lb[0][0]
|
||||
assert "message" == sr[0][2] == lb[0][2]
|
||||
|
||||
def test_safety_nooutput():
|
||||
p = connect_wo_esp()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_safety_nooutput(serial=None):
|
||||
p = connect_wo_esp(serial)
|
||||
|
||||
# enable output mode
|
||||
p.set_safety_mode(Panda.SAFETY_NOOUTPUT)
|
||||
|
@ -59,8 +63,10 @@ def test_safety_nooutput():
|
|||
r = p.can_recv()
|
||||
assert len(r) == 0
|
||||
|
||||
def test_reliability():
|
||||
p = connect_wo_esp()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_reliability(serial=None):
|
||||
p = connect_wo_esp(serial)
|
||||
|
||||
LOOP_COUNT = 100
|
||||
MSG_COUNT = 100
|
||||
|
@ -97,8 +103,10 @@ def test_reliability():
|
|||
sys.stdout.write("P")
|
||||
sys.stdout.flush()
|
||||
|
||||
def test_throughput():
|
||||
p = connect_wo_esp()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_throughput(serial=None):
|
||||
p = connect_wo_esp(serial)
|
||||
|
||||
# enable output mode
|
||||
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||
|
@ -120,8 +128,10 @@ def test_throughput():
|
|||
|
||||
print("loopback 100 messages at speed %d, comp speed is %.2f, percent %.2f" % (speed, comp_kbps, saturation_pct))
|
||||
|
||||
def test_gmlan():
|
||||
p = connect_wo_esp()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_gmlan(serial=None):
|
||||
p = connect_wo_esp(serial)
|
||||
|
||||
if p.legacy:
|
||||
return
|
||||
|
@ -135,7 +145,7 @@ def test_gmlan():
|
|||
p.set_can_speed_kbps(1, SPEED_NORMAL)
|
||||
p.set_can_speed_kbps(2, SPEED_NORMAL)
|
||||
p.set_can_speed_kbps(3, SPEED_GMLAN)
|
||||
|
||||
|
||||
# set gmlan on CAN2
|
||||
for bus in [Panda.GMLAN_CAN2, Panda.GMLAN_CAN3, Panda.GMLAN_CAN2, Panda.GMLAN_CAN3]:
|
||||
p.set_gmlan(bus)
|
||||
|
@ -150,8 +160,10 @@ def test_gmlan():
|
|||
|
||||
print("%d: %.2f kbps vs %.2f kbps" % (bus, comp_kbps_gmlan, comp_kbps_normal))
|
||||
|
||||
def test_gmlan_bad_toggle():
|
||||
p = connect_wo_esp()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_gmlan_bad_toggle(serial=None):
|
||||
p = connect_wo_esp(serial)
|
||||
|
||||
if p.legacy:
|
||||
return
|
||||
|
@ -178,9 +190,10 @@ def test_gmlan_bad_toggle():
|
|||
|
||||
|
||||
# this will fail if you have hardware serial connected
|
||||
def test_serial_debug():
|
||||
p = connect_wo_esp()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_serial_debug(serial=None):
|
||||
p = connect_wo_esp(serial)
|
||||
junk = p.serial_read(Panda.SERIAL_DEBUG)
|
||||
p.call_control_api(0xc0)
|
||||
assert(p.serial_read(Panda.SERIAL_DEBUG).startswith("can "))
|
||||
|
||||
|
|
|
@ -1,33 +1,60 @@
|
|||
from __future__ import print_function
|
||||
import os
|
||||
import time
|
||||
from panda import Panda
|
||||
from helpers import connect_wifi
|
||||
from helpers import connect_wifi, test_white, test_white_and_grey, panda_color_to_serial
|
||||
import requests
|
||||
|
||||
def test_get_serial():
|
||||
p = Panda()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_get_serial(serial=None):
|
||||
p = Panda(serial)
|
||||
print(p.get_serial())
|
||||
|
||||
def test_get_serial_in_flash_mode():
|
||||
p = Panda()
|
||||
@test_white_and_grey
|
||||
@panda_color_to_serial
|
||||
def test_get_serial_in_flash_mode(serial=None):
|
||||
p = Panda(serial)
|
||||
p.reset(enter_bootstub=True)
|
||||
assert(p.bootstub)
|
||||
print(p.get_serial())
|
||||
p.reset()
|
||||
|
||||
def test_connect_wifi():
|
||||
connect_wifi()
|
||||
@test_white
|
||||
@panda_color_to_serial
|
||||
def test_connect_wifi(serial=None):
|
||||
connect_wifi(serial)
|
||||
|
||||
def test_flash_wifi():
|
||||
Panda.flash_ota_wifi()
|
||||
connect_wifi()
|
||||
@test_white
|
||||
@panda_color_to_serial
|
||||
def test_flash_wifi(serial=None):
|
||||
connect_wifi(serial)
|
||||
assert Panda.flash_ota_wifi(release=True), "OTA Wifi Flash Failed"
|
||||
connect_wifi(serial)
|
||||
|
||||
def test_wifi_flash_st():
|
||||
Panda.flash_ota_st()
|
||||
@test_white
|
||||
@panda_color_to_serial
|
||||
def test_wifi_flash_st(serial=None):
|
||||
connect_wifi(serial)
|
||||
assert Panda.flash_ota_st(), "OTA ST Flash Failed"
|
||||
connected = False
|
||||
st = time.time()
|
||||
while not connected and (time.time() - st) < 20:
|
||||
try:
|
||||
p = Panda(serial=serial)
|
||||
p.get_serial()
|
||||
connected = True
|
||||
except:
|
||||
time.sleep(1)
|
||||
|
||||
def test_webpage_fetch():
|
||||
if not connected:
|
||||
assert False, "Panda failed to connect on USB after flashing"
|
||||
|
||||
@test_white
|
||||
@panda_color_to_serial
|
||||
def test_webpage_fetch(serial=None):
|
||||
connect_wifi(serial)
|
||||
r = requests.get("http://192.168.0.10/")
|
||||
print(r.text)
|
||||
|
||||
assert "This is your comma.ai panda" in r.text
|
||||
|
||||
|
|
|
@ -1,17 +1,22 @@
|
|||
from __future__ import print_function
|
||||
import time
|
||||
from panda import Panda
|
||||
from helpers import time_many_sends, connect_wifi
|
||||
from helpers import time_many_sends, connect_wifi, test_white, panda_color_to_serial
|
||||
from nose.tools import timed, assert_equal, assert_less, assert_greater
|
||||
|
||||
def test_get_serial_wifi():
|
||||
connect_wifi()
|
||||
@test_white
|
||||
@panda_color_to_serial
|
||||
def test_get_serial_wifi(serial=None):
|
||||
connect_wifi(serial)
|
||||
|
||||
p = Panda("WIFI")
|
||||
print(p.get_serial())
|
||||
|
||||
def test_throughput():
|
||||
p = Panda()
|
||||
@test_white
|
||||
@panda_color_to_serial
|
||||
def test_throughput(serial=None):
|
||||
connect_wifi(serial)
|
||||
p = Panda(serial)
|
||||
|
||||
# enable output mode
|
||||
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||
|
@ -24,7 +29,7 @@ def test_throughput():
|
|||
for speed in [100,250,500,750,1000]:
|
||||
# set bus 0 speed to speed
|
||||
p.set_can_speed_kbps(0, speed)
|
||||
time.sleep(0.05)
|
||||
time.sleep(0.1)
|
||||
|
||||
comp_kbps = time_many_sends(p, 0)
|
||||
|
||||
|
@ -35,8 +40,11 @@ def test_throughput():
|
|||
|
||||
print("WIFI loopback 100 messages at speed %d, comp speed is %.2f, percent %.2f" % (speed, comp_kbps, saturation_pct))
|
||||
|
||||
def test_recv_only():
|
||||
p = Panda()
|
||||
@test_white
|
||||
@panda_color_to_serial
|
||||
def test_recv_only(serial=None):
|
||||
connect_wifi(serial)
|
||||
p = Panda(serial)
|
||||
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||
p.set_can_loopback(True)
|
||||
pwifi = Panda("WIFI")
|
||||
|
@ -49,4 +57,3 @@ def test_recv_only():
|
|||
saturation_pct = (comp_kbps/speed) * 100.0
|
||||
|
||||
print("HT WIFI loopback %d messages at speed %d, comp speed is %.2f, percent %.2f" % (msg_count, speed, comp_kbps, saturation_pct))
|
||||
|
||||
|
|
|
@ -1,14 +1,16 @@
|
|||
from __future__ import print_function
|
||||
import sys
|
||||
import time
|
||||
from helpers import time_many_sends, connect_wifi
|
||||
from helpers import time_many_sends, connect_wifi, test_white, panda_color_to_serial
|
||||
from panda import Panda, PandaWifiStreaming
|
||||
from nose.tools import timed, assert_equal, assert_less, assert_greater
|
||||
|
||||
def test_udp_doesnt_drop():
|
||||
connect_wifi()
|
||||
@test_white
|
||||
@panda_color_to_serial
|
||||
def test_udp_doesnt_drop(serial=None):
|
||||
connect_wifi(serial)
|
||||
|
||||
p = Panda()
|
||||
p = Panda(serial)
|
||||
p.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||
p.set_can_loopback(True)
|
||||
|
||||
|
@ -18,6 +20,7 @@ def test_udp_doesnt_drop():
|
|||
break
|
||||
|
||||
for msg_count in [1, 100]:
|
||||
saturation_pcts = []
|
||||
for i in range({1: 0x80, 100: 0x20}[msg_count]):
|
||||
pwifi.kick()
|
||||
|
||||
|
@ -31,9 +34,33 @@ def test_udp_doesnt_drop():
|
|||
sys.stdout.flush()
|
||||
else:
|
||||
print("UDP WIFI loopback %d messages at speed %d, comp speed is %.2f, percent %.2f" % (msg_count, speed, comp_kbps, saturation_pct))
|
||||
assert_greater(saturation_pct, 40)
|
||||
assert_greater(saturation_pct, 20) #sometimes the wifi can be slow...
|
||||
assert_less(saturation_pct, 100)
|
||||
print("")
|
||||
|
||||
|
||||
saturation_pcts.append(saturation_pct)
|
||||
if len(saturation_pcts) > 0:
|
||||
assert_greater(sum(saturation_pcts)/len(saturation_pcts), 60)
|
||||
|
||||
time.sleep(5)
|
||||
usb_ok_cnt = 0
|
||||
REQ_USB_OK_CNT = 500
|
||||
st = time.time()
|
||||
msg_id = 0x1bb
|
||||
bus = 0
|
||||
last_missing_msg = 0
|
||||
while usb_ok_cnt < REQ_USB_OK_CNT and (time.time() - st) < 40:
|
||||
p.can_send(msg_id, "message", bus)
|
||||
time.sleep(0.01)
|
||||
r = [1]
|
||||
missing = True
|
||||
while len(r) > 0:
|
||||
r = p.can_recv()
|
||||
r = filter(lambda x: x[3] == bus and x[0] == msg_id, r)
|
||||
if len(r) > 0:
|
||||
missing = False
|
||||
usb_ok_cnt += len(r)
|
||||
if missing:
|
||||
last_missing_msg = time.time()
|
||||
et = time.time() - st
|
||||
last_missing_msg = last_missing_msg - st
|
||||
print("waited {} for panda to recv can on usb, {} msgs, last missing at {}".format(et, usb_ok_cnt, last_missing_msg))
|
||||
assert usb_ok_cnt >= REQ_USB_OK_CNT, "Unable to recv can on USB after UDP"
|
||||
|
|
|
@ -0,0 +1,121 @@
|
|||
from __future__ import print_function
|
||||
import time
|
||||
from panda import Panda
|
||||
from nose.tools import assert_equal, assert_less, assert_greater
|
||||
from helpers import time_many_sends, test_two_panda, panda_color_to_serial
|
||||
|
||||
@test_two_panda
|
||||
@panda_color_to_serial
|
||||
def test_send_recv(serial_sender=None, serial_reciever=None):
|
||||
p_send = Panda(serial_sender)
|
||||
p_recv = Panda(serial_reciever)
|
||||
|
||||
p_send.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||
p_send.set_can_loopback(False)
|
||||
|
||||
p_recv.set_can_loopback(False)
|
||||
|
||||
assert not p_send.legacy
|
||||
assert not p_recv.legacy
|
||||
|
||||
p_send.can_send_many([(0x1ba, 0, "message", 0)]*2)
|
||||
time.sleep(0.05)
|
||||
p_recv.can_recv()
|
||||
p_send.can_recv()
|
||||
|
||||
busses = [0,1,2]
|
||||
|
||||
for bus in busses:
|
||||
for speed in [100, 250, 500, 750, 1000]:
|
||||
p_send.set_can_speed_kbps(bus, speed)
|
||||
p_recv.set_can_speed_kbps(bus, speed)
|
||||
time.sleep(0.05)
|
||||
|
||||
comp_kbps = time_many_sends(p_send, bus, p_recv, two_pandas=True)
|
||||
|
||||
saturation_pct = (comp_kbps/speed) * 100.0
|
||||
assert_greater(saturation_pct, 80)
|
||||
assert_less(saturation_pct, 100)
|
||||
|
||||
print("two pandas bus {}, 100 messages at speed {:4d}, comp speed is {:7.2f}, percent {:6.2f}".format(bus, speed, comp_kbps, saturation_pct))
|
||||
|
||||
@test_two_panda
|
||||
@panda_color_to_serial
|
||||
def test_latency(serial_sender=None, serial_reciever=None):
|
||||
p_send = Panda(serial_sender)
|
||||
p_recv = Panda(serial_reciever)
|
||||
|
||||
p_send.set_safety_mode(Panda.SAFETY_ALLOUTPUT)
|
||||
p_send.set_can_loopback(False)
|
||||
|
||||
p_recv.set_can_loopback(False)
|
||||
|
||||
assert not p_send.legacy
|
||||
assert not p_recv.legacy
|
||||
|
||||
p_send.set_can_speed_kbps(0, 100)
|
||||
p_recv.set_can_speed_kbps(0, 100)
|
||||
time.sleep(0.05)
|
||||
|
||||
p_send.can_send_many([(0x1ba, 0, "testmsg", 0)]*10)
|
||||
time.sleep(0.05)
|
||||
p_recv.can_recv()
|
||||
p_send.can_recv()
|
||||
|
||||
busses = [0,1,2]
|
||||
|
||||
for bus in busses:
|
||||
for speed in [100, 250, 500, 750, 1000]:
|
||||
p_send.set_can_speed_kbps(bus, speed)
|
||||
p_recv.set_can_speed_kbps(bus, speed)
|
||||
time.sleep(0.1)
|
||||
#clear can buffers
|
||||
r = [1]
|
||||
while len(r) > 0:
|
||||
r = p_send.can_recv()
|
||||
r = [1]
|
||||
while len(r) > 0:
|
||||
r = p_recv.can_recv()
|
||||
time.sleep(0.05)
|
||||
|
||||
latencies = []
|
||||
comp_kbps_list = []
|
||||
saturation_pcts = []
|
||||
|
||||
num_messages = 100
|
||||
|
||||
for i in range(num_messages):
|
||||
st = time.time()
|
||||
p_send.can_send(0x1ab, "message", bus)
|
||||
r = []
|
||||
while len(r) < 1 and (time.time() - st) < 5:
|
||||
r = p_recv.can_recv()
|
||||
et = time.time()
|
||||
r_echo = []
|
||||
while len(r_echo) < 1 and (time.time() - st) < 10:
|
||||
r_echo = p_send.can_recv()
|
||||
|
||||
if len(r) == 0 or len(r_echo) == 0:
|
||||
print("r: {}, r_echo: {}".format(r, r_echo))
|
||||
|
||||
assert_equal(len(r),1)
|
||||
assert_equal(len(r_echo),1)
|
||||
|
||||
et = (et - st)*1000.0
|
||||
comp_kbps = (1+11+1+1+1+4+8*8+15+1+1+1+7) / et
|
||||
latency = et - ((1+11+1+1+1+4+8*8+15+1+1+1+7) / speed)
|
||||
|
||||
assert_less(latency, 5.0)
|
||||
|
||||
saturation_pct = (comp_kbps/speed) * 100.0
|
||||
latencies.append(latency)
|
||||
comp_kbps_list.append(comp_kbps)
|
||||
saturation_pcts.append(saturation_pct)
|
||||
|
||||
average_latency = sum(latencies)/num_messages
|
||||
assert_less(average_latency, 1.0)
|
||||
average_comp_kbps = sum(comp_kbps_list)/num_messages
|
||||
average_saturation_pct = sum(saturation_pcts)/num_messages
|
||||
|
||||
print("two pandas bus {}, {} message average at speed {:4d}, latency is {:5.3f}ms, comp speed is {:7.2f}, percent {:6.2f}"\
|
||||
.format(bus, num_messages, speed, average_latency, average_comp_kbps, average_saturation_pct))
|
|
@ -4,12 +4,34 @@ import time
|
|||
import random
|
||||
import subprocess
|
||||
import requests
|
||||
from functools import wraps
|
||||
from panda import Panda
|
||||
from nose.tools import timed, assert_equal, assert_less, assert_greater
|
||||
from parameterized import parameterized, param
|
||||
|
||||
def connect_wo_esp():
|
||||
test_white_and_grey = parameterized([param(panda_color="White"),
|
||||
param(panda_color="Grey")])
|
||||
test_white = parameterized([param(panda_color="White")])
|
||||
test_grey = parameterized([param(panda_color="Grey")])
|
||||
test_two_panda = parameterized([param(panda_color=["Grey", "White"]),
|
||||
param(panda_color=["White", "Grey"])])
|
||||
|
||||
_serials = {}
|
||||
def get_panda_serial(is_grey=None):
|
||||
global _serials
|
||||
if is_grey not in _serials:
|
||||
for serial in Panda.list():
|
||||
p = Panda(serial=serial)
|
||||
if is_grey is None or p.is_grey() == is_grey:
|
||||
_serials[is_grey] = serial
|
||||
return serial
|
||||
raise IOError("Panda not found. is_grey: {}".format(is_grey))
|
||||
else:
|
||||
return _serials[is_grey]
|
||||
|
||||
def connect_wo_esp(serial=None):
|
||||
# connect to the panda
|
||||
p = Panda()
|
||||
p = Panda(serial=serial)
|
||||
|
||||
# power down the ESP
|
||||
p.set_esp_power(False)
|
||||
|
@ -20,15 +42,28 @@ def connect_wo_esp():
|
|||
|
||||
return p
|
||||
|
||||
def connect_wifi():
|
||||
p = Panda()
|
||||
def connect_wifi(serial=None):
|
||||
p = Panda(serial=serial)
|
||||
p.set_esp_power(True)
|
||||
dongle_id, pw = p.get_serial()
|
||||
assert(dongle_id.isalnum())
|
||||
_connect_wifi(dongle_id, pw)
|
||||
|
||||
FNULL = open(os.devnull, 'w')
|
||||
def _connect_wifi(dongle_id, pw, insecure_okay=False):
|
||||
ssid = str("panda-" + dongle_id)
|
||||
|
||||
r = subprocess.call(["ping", "-W", "4", "-c", "1", "192.168.0.10"], stdout=FNULL, stderr=subprocess.STDOUT)
|
||||
if not r:
|
||||
#Can already ping, try connecting on wifi
|
||||
try:
|
||||
p = Panda("WIFI")
|
||||
p.get_serial()
|
||||
print("Already connected")
|
||||
return
|
||||
except:
|
||||
pass
|
||||
|
||||
print("WIFI: connecting to %s" % ssid)
|
||||
|
||||
while 1:
|
||||
|
@ -39,8 +74,8 @@ def _connect_wifi(dongle_id, pw, insecure_okay=False):
|
|||
cnt = 0
|
||||
MAX_TRIES = 10
|
||||
while cnt < MAX_TRIES:
|
||||
print "WIFI: scanning %d" % cnt
|
||||
os.system("sudo iwlist %s scanning > /dev/null" % wlan_interface)
|
||||
print("WIFI: scanning %d" % cnt)
|
||||
os.system("iwlist %s scanning > /dev/null" % wlan_interface)
|
||||
os.system("nmcli device wifi rescan")
|
||||
wifi_scan = filter(lambda x: ssid in x, subprocess.check_output(["nmcli","dev", "wifi", "list"]).split("\n"))
|
||||
if len(wifi_scan) != 0:
|
||||
|
@ -51,45 +86,107 @@ def _connect_wifi(dongle_id, pw, insecure_okay=False):
|
|||
assert cnt < MAX_TRIES
|
||||
if "-pair" in wifi_scan[0]:
|
||||
os.system("nmcli d wifi connect %s-pair" % (ssid))
|
||||
connect_cnt = 0
|
||||
MAX_TRIES = 20
|
||||
while connect_cnt < MAX_TRIES:
|
||||
connect_cnt += 1
|
||||
r = subprocess.call(["ping", "-W", "4", "-c", "1", "192.168.0.10"], stdout=FNULL, stderr=subprocess.STDOUT)
|
||||
if r:
|
||||
print("Waiting for panda to ping...")
|
||||
time.sleep(0.1)
|
||||
else:
|
||||
break
|
||||
if insecure_okay:
|
||||
break
|
||||
# fetch webpage
|
||||
print "connecting to insecure network to secure"
|
||||
r = requests.get("http://192.168.0.10/")
|
||||
print("connecting to insecure network to secure")
|
||||
try:
|
||||
r = requests.get("http://192.168.0.10/")
|
||||
except requests.ConnectionError:
|
||||
r = requests.get("http://192.168.0.10/")
|
||||
assert r.status_code==200
|
||||
|
||||
print "securing"
|
||||
print("securing")
|
||||
try:
|
||||
r = requests.get("http://192.168.0.10/secure", timeout=0.01)
|
||||
except requests.exceptions.Timeout:
|
||||
print("timeout http request to secure")
|
||||
pass
|
||||
else:
|
||||
os.system("nmcli d wifi connect %s password %s" % (ssid, pw))
|
||||
break
|
||||
|
||||
ret = os.system("nmcli d wifi connect %s password %s" % (ssid, pw))
|
||||
if os.WEXITSTATUS(ret) == 0:
|
||||
#check ping too
|
||||
ping_ok = False
|
||||
connect_cnt = 0
|
||||
MAX_TRIES = 10
|
||||
while connect_cnt < MAX_TRIES:
|
||||
connect_cnt += 1
|
||||
r = subprocess.call(["ping", "-W", "4", "-c", "1", "192.168.0.10"], stdout=FNULL, stderr=subprocess.STDOUT)
|
||||
if r:
|
||||
print("Waiting for panda to ping...")
|
||||
time.sleep(0.1)
|
||||
else:
|
||||
ping_ok = True
|
||||
break
|
||||
if ping_ok:
|
||||
break
|
||||
|
||||
# TODO: confirm that it's connected to the right panda
|
||||
|
||||
def time_many_sends(p, bus, precv=None, msg_count=100, msg_id=None):
|
||||
def time_many_sends(p, bus, precv=None, msg_count=100, msg_id=None, two_pandas=False):
|
||||
if precv == None:
|
||||
precv = p
|
||||
if msg_id == None:
|
||||
msg_id = random.randint(0x100, 0x200)
|
||||
if p == precv and two_pandas:
|
||||
raise ValueError("Cannot have two pandas that are the same panda")
|
||||
|
||||
st = time.time()
|
||||
p.can_send_many([(msg_id, 0, "\xaa"*8, bus)]*msg_count)
|
||||
r = []
|
||||
r_echo = []
|
||||
r_len_expected = msg_count if two_pandas else msg_count*2
|
||||
r_echo_len_exected = msg_count if two_pandas else 0
|
||||
|
||||
while len(r) < (msg_count*2) and (time.time() - st) < 3:
|
||||
while len(r) < r_len_expected and (time.time() - st) < 5:
|
||||
r.extend(precv.can_recv())
|
||||
et = time.time()
|
||||
if two_pandas:
|
||||
while len(r_echo) < r_echo_len_exected and (time.time() - st) < 10:
|
||||
r_echo.extend(p.can_recv())
|
||||
|
||||
sent_echo = filter(lambda x: x[3] == 0x80 | bus and x[0] == msg_id, r)
|
||||
loopback_resp = filter(lambda x: x[3] == bus and x[0] == msg_id, r)
|
||||
sent_echo.extend(filter(lambda x: x[3] == 0x80 | bus and x[0] == msg_id, r_echo))
|
||||
resp = filter(lambda x: x[3] == bus and x[0] == msg_id, r)
|
||||
|
||||
leftovers = filter(lambda x: (x[3] != 0x80 | bus and x[3] != bus) or x[0] != msg_id, r)
|
||||
assert_equal(len(leftovers), 0)
|
||||
|
||||
assert_equal(len(resp), msg_count)
|
||||
assert_equal(len(sent_echo), msg_count)
|
||||
assert_equal(len(loopback_resp), msg_count)
|
||||
|
||||
et = (time.time()-st)*1000.0
|
||||
et = (et-st)*1000.0
|
||||
comp_kbps = (1+11+1+1+1+4+8*8+15+1+1+1+7)*msg_count / et
|
||||
|
||||
return comp_kbps
|
||||
|
||||
|
||||
def panda_color_to_serial(fn):
|
||||
@wraps(fn)
|
||||
def wrapper(panda_color=None, **kwargs):
|
||||
pandas_is_grey = []
|
||||
if panda_color is not None:
|
||||
if not isinstance(panda_color, list):
|
||||
panda_color = [panda_color]
|
||||
panda_color = [s.lower() for s in panda_color]
|
||||
for p in panda_color:
|
||||
if p is None:
|
||||
pandas_is_grey.append(None)
|
||||
elif p in ["grey", "gray"]:
|
||||
pandas_is_grey.append(True)
|
||||
elif p in ["white"]:
|
||||
pandas_is_grey.append(False)
|
||||
else:
|
||||
raise ValueError("Invalid Panda Color {}".format(p))
|
||||
return fn(*[get_panda_serial(is_grey) for is_grey in pandas_is_grey], **kwargs)
|
||||
return wrapper
|
||||
|
|
|
@ -21,6 +21,9 @@ if __name__ == "__main__":
|
|||
|
||||
pandas = list(map(lambda x: Panda(x, claim=claim), serials))
|
||||
|
||||
if not len(pandas):
|
||||
sys.exit("no pandas found")
|
||||
|
||||
if os.getenv("BAUD") is not None:
|
||||
for panda in pandas:
|
||||
panda.set_uart_baud(port_number, int(os.getenv("BAUD")))
|
||||
|
|
|
@ -246,3 +246,12 @@ void reset_gmlan_switch_timeout(void){
|
|||
|
||||
void gmlan_switch_init(int timeout_enable){
|
||||
}
|
||||
|
||||
void lline_relay_init (void) {
|
||||
}
|
||||
|
||||
void lline_relay_release (void) {
|
||||
}
|
||||
|
||||
void set_lline_output(int to_set) {
|
||||
}
|
||||
|
|
|
@ -23,6 +23,7 @@ enum34==1.1.6
|
|||
evdev==0.6.1
|
||||
fastcluster==1.1.20
|
||||
filterpy==1.2.4
|
||||
hexdump==3.3
|
||||
ipaddress==1.0.16
|
||||
json-rpc==1.12.1
|
||||
libusb1==1.5.0
|
||||
|
@ -30,7 +31,9 @@ lmdb==0.92
|
|||
mpmath==1.0.0
|
||||
nose==1.3.7
|
||||
numpy==1.11.1
|
||||
opencv-python==3.4.0.12
|
||||
pause==0.1.2
|
||||
psutil==3.4.2
|
||||
py==1.4.31
|
||||
pyOpenSSL==16.0.0
|
||||
pyasn1-modules==0.0.8
|
||||
|
@ -39,6 +42,7 @@ pycapnp==0.6.3
|
|||
pycparser==2.18
|
||||
pycrypto==2.6.1
|
||||
pyflakes==1.6.0
|
||||
pylint==1.8.3
|
||||
pyopencl==2016.1
|
||||
pyparsing==2.1.10
|
||||
#pypcap==1.1.5 needs extra dependencies and is not used
|
||||
|
|
|
@ -6,7 +6,7 @@ import time
|
|||
import threading
|
||||
import traceback
|
||||
import zmq
|
||||
import Queue
|
||||
import six.moves.queue
|
||||
from jsonrpc import JSONRPCResponseManager, dispatcher
|
||||
from websocket import create_connection, WebSocketTimeoutException
|
||||
|
||||
|
@ -21,8 +21,8 @@ ATHENA_HOST = os.getenv('ATHENA_HOST', 'wss://athena.comma.ai')
|
|||
HANDLER_THREADS = os.getenv('HANDLER_THREADS', 4)
|
||||
|
||||
dispatcher["echo"] = lambda s: s
|
||||
payload_queue = Queue.Queue()
|
||||
response_queue = Queue.Queue()
|
||||
payload_queue = six.moves.queue.Queue()
|
||||
response_queue = six.moves.queue.Queue()
|
||||
|
||||
def handle_long_poll(ws):
|
||||
end_event = threading.Event()
|
||||
|
@ -52,7 +52,7 @@ def jsonrpc_handler(end_event):
|
|||
data = payload_queue.get(timeout=1)
|
||||
response = JSONRPCResponseManager.handle(data, dispatcher)
|
||||
response_queue.put_nowait(response)
|
||||
except Queue.Empty:
|
||||
except six.moves.queue.Empty:
|
||||
pass
|
||||
except Exception as e:
|
||||
cloudlog.exception("athena jsonrpc handler failed")
|
||||
|
@ -87,7 +87,7 @@ def ws_send(ws, end_event):
|
|||
try:
|
||||
response = response_queue.get(timeout=1)
|
||||
ws.send(response.json)
|
||||
except Queue.Empty:
|
||||
except six.moves.queue.Empty:
|
||||
pass
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
|
|
|
@ -127,16 +127,13 @@ def boardd_mock_loop():
|
|||
|
||||
while 1:
|
||||
tsc = messaging.drain_sock(logcan, wait_for_one=True)
|
||||
snds = map(lambda x: can_capnp_to_can_list(x.can), tsc)
|
||||
snd = []
|
||||
for s in snds:
|
||||
snd += s
|
||||
snd = filter(lambda x: x[-1] <= 1, snd)
|
||||
can_send_many(snd)
|
||||
snds = [can_capnp_to_can_list(x.can) for x in tsc]
|
||||
snds = [x for x in snds if x[-1] <= 1]
|
||||
can_send_many(snds)
|
||||
|
||||
# recv @ 100hz
|
||||
can_msgs = can_recv()
|
||||
print("sent %d got %d" % (len(snd), len(can_msgs)))
|
||||
print("sent %d got %d" % (len(snds), len(can_msgs)))
|
||||
m = can_list_to_can_capnp(can_msgs)
|
||||
sendcan.send(m.to_bytes())
|
||||
|
||||
|
@ -220,7 +217,7 @@ def boardd_proxy_loop(rate=200, address="192.168.2.251"):
|
|||
# recv @ 100hz
|
||||
can_msgs = can_recv()
|
||||
#for m in can_msgs:
|
||||
# print "R:",hex(m[0]), str(m[2]).encode("hex")
|
||||
# print("R: {0} {1}".format(hex(m[0]), str(m[2]).encode("hex")))
|
||||
|
||||
# publish to logger
|
||||
# TODO: refactor for speed
|
||||
|
@ -233,7 +230,7 @@ def boardd_proxy_loop(rate=200, address="192.168.2.251"):
|
|||
if tsc is not None:
|
||||
cl = can_capnp_to_can_list(tsc.can)
|
||||
#for m in cl:
|
||||
# print "S:",hex(m[0]), str(m[2]).encode("hex")
|
||||
# print("S: {0} {1}".format(hex(m[0]), str(m[2]).encode("hex")))
|
||||
can_send_many(cl)
|
||||
|
||||
rk.keep_time()
|
||||
|
|
|
@ -16,6 +16,7 @@ WARN_FLAGS = -Werror=implicit-function-declaration \
|
|||
|
||||
CFLAGS = -std=gnu11 -g -fPIC -O2 $(WARN_FLAGS)
|
||||
CXXFLAGS = -std=c++11 -g -fPIC -O2 $(WARN_FLAGS)
|
||||
LDFLAGS =
|
||||
|
||||
ifeq ($(UNAME_S),Darwin)
|
||||
ZMQ_LIBS = -L/usr/local/lib -lzmq
|
||||
|
@ -28,18 +29,24 @@ else ifeq ($(UNAME_M),x86_64)
|
|||
else ifeq ($(UNAME_M),aarch64)
|
||||
ZMQ_FLAGS = -I$(PHONELIBS)/zmq/aarch64/include
|
||||
ZMQ_LIBS = -L$(PHONELIBS)/zmq/aarch64/lib -l:libzmq.a
|
||||
CXXFLAGS += -lgnustl_shared
|
||||
LDFLAGS += -lgnustl_shared
|
||||
endif
|
||||
|
||||
OBJDIR = obj
|
||||
|
||||
OPENDBC_PATH := $(shell python -c 'import opendbc; print opendbc.DBC_PATH')
|
||||
|
||||
DBC_SOURCES := $(wildcard $(OPENDBC_PATH)/*.dbc)
|
||||
DBC_OBJS := $(patsubst $(OPENDBC_PATH)/%.dbc,$(OBJDIR)/%.o,$(DBC_SOURCES))
|
||||
DBC_CCS := $(patsubst $(OPENDBC_PATH)/%.dbc,dbc_out/%.cc,$(DBC_SOURCES))
|
||||
.SECONDARY: $(DBC_CCS)
|
||||
|
||||
LIBDBC_OBJS := $(OBJDIR)/dbc.o $(OBJDIR)/parser.o $(OBJDIR)/packer.o
|
||||
|
||||
CWD := $(shell pwd)
|
||||
|
||||
.PHONY: all
|
||||
all: libdbc.so
|
||||
all: $(OBJDIR) libdbc.so
|
||||
|
||||
include ../common/cereal.mk
|
||||
|
||||
|
@ -49,22 +56,45 @@ libdbc.so:: ../../cereal/gen/cpp/log.capnp.h
|
|||
../../cereal/gen/cpp/log.capnp.h:
|
||||
cd ../../cereal && make
|
||||
|
||||
libdbc.so:: dbc.cc parser.cc packer.cc $(DBC_CCS)
|
||||
libdbc.so:: $(LIBDBC_OBJS) $(DBC_OBJS)
|
||||
@echo "[ LINK ] $@"
|
||||
$(CXX) -fPIC -shared -o '$@' $^ \
|
||||
-I. \
|
||||
-I../.. \
|
||||
$(CXXFLAGS) \
|
||||
$(ZMQ_FLAGS) \
|
||||
$(ZMQ_LIBS) \
|
||||
$(CEREAL_CXXFLAGS) \
|
||||
$(CEREAL_LIBS)
|
||||
-I. -I../.. \
|
||||
$(CXXFLAGS) \
|
||||
$(LDFLAGS) \
|
||||
$(ZMQ_FLAGS) \
|
||||
$(ZMQ_LIBS) \
|
||||
$(CEREAL_CXXFLAGS) \
|
||||
$(CEREAL_LIBS)
|
||||
|
||||
dbc_out/%.cc: $(OPENDBC_PATH)/%.dbc process_dbc.py dbc_template.cc
|
||||
PYTHONPATH=$(PYTHONPATH):$(CWD)/../../pyextra ./process_dbc.py '$<' '$@'
|
||||
$(OBJDIR)/%.o: %.cc
|
||||
@echo "[ CXX ] $@"
|
||||
$(CXX) -fPIC -c -o '$@' $^ \
|
||||
-I. -I../.. \
|
||||
$(CXXFLAGS) \
|
||||
$(ZMQ_FLAGS) \
|
||||
$(CEREAL_CXXFLAGS) \
|
||||
|
||||
.PHONY: clean
|
||||
$(OBJDIR)/%.o: dbc_out/%.cc
|
||||
@echo "[ CXX ] $@"
|
||||
$(CXX) -fPIC -c -o '$@' $^ \
|
||||
-I. -I../.. \
|
||||
$(CXXFLAGS) \
|
||||
$(ZMQ_FLAGS) \
|
||||
$(CEREAL_CXXFLAGS) \
|
||||
|
||||
dbc_out/%.cc: process_dbc.py dbc_template.cc $(OPENDBC_PATH)/%.dbc
|
||||
@echo "[ DBC GEN ] $@"
|
||||
@echo "Missing prereq $?"
|
||||
PYTHONPATH=$(PYTHONPATH):$(CWD)/../../pyextra ./process_dbc.py $(OPENDBC_PATH) dbc_out
|
||||
|
||||
$(OBJDIR):
|
||||
mkdir -p $@
|
||||
|
||||
.PHONY: clean $(OBJDIR)
|
||||
clean:
|
||||
rm -rf libdbc.so*
|
||||
rm -f dbc_out/*.cc
|
||||
rm -f dbcs.txt
|
||||
rm -f dbcs.csv
|
||||
rm -rf $(OBJDIR)/*
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import six
|
||||
import struct
|
||||
from selfdrive.can.libdbc_py import libdbc, ffi
|
||||
|
||||
|
@ -20,7 +21,7 @@ class CANPacker(object):
|
|||
|
||||
def pack(self, addr, values, counter):
|
||||
values_thing = []
|
||||
for name, value in values.iteritems():
|
||||
for name, value in six.iteritems(values):
|
||||
if name not in self.sig_names:
|
||||
self.sig_names[name] = ffi.new("char[]", name)
|
||||
|
||||
|
@ -63,5 +64,5 @@ if __name__ == "__main__":
|
|||
#s = cp.pack_bytes(0xe4, {
|
||||
# "STEER_TORQUE": -2,
|
||||
#})
|
||||
print [hex(ord(v)) for v in s[1]]
|
||||
print([hex(ord(v)) for v in s[1]])
|
||||
print(s[1].encode("hex"))
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import six
|
||||
import time
|
||||
from collections import defaultdict
|
||||
import numbers
|
||||
|
@ -58,7 +59,7 @@ class CANParser(object):
|
|||
{
|
||||
'address': msg_address,
|
||||
'check_frequency': freq,
|
||||
} for msg_address, freq in message_options.iteritems()])
|
||||
} for msg_address, freq in six.iteritems(message_options)])
|
||||
|
||||
self.can = libdbc.can_init(bus, dbc_name, len(message_options_c), message_options_c,
|
||||
len(signal_options_c), signal_options_c, sendcan, tcp_addr)
|
||||
|
@ -68,7 +69,7 @@ class CANParser(object):
|
|||
value_count = libdbc.can_query(self.can, 0, self.p_can_valid, 0, ffi.NULL)
|
||||
self.can_values = ffi.new("SignalValue[%d]" % value_count)
|
||||
self.update_vl(0)
|
||||
# print "==="
|
||||
# print("===")
|
||||
|
||||
def update_vl(self, sec):
|
||||
|
||||
|
@ -77,12 +78,12 @@ class CANParser(object):
|
|||
|
||||
self.can_valid = self.p_can_valid[0]
|
||||
|
||||
# print can_values_len
|
||||
# print(can_values_len)
|
||||
ret = set()
|
||||
for i in xrange(can_values_len):
|
||||
cv = self.can_values[i]
|
||||
address = cv.address
|
||||
# print hex(cv.address), ffi.string(cv.name)
|
||||
# print("{0} {1}".format(hex(cv.address), ffi.string(cv.name)))
|
||||
name = ffi.string(cv.name)
|
||||
self.vl[address][name] = cv.value
|
||||
self.ts[address][name] = cv.ts
|
||||
|
@ -240,11 +241,11 @@ if __name__ == "__main__":
|
|||
|
||||
cp = CANParser("toyota_rav4_2017_pt_generated", signals, checks, 0)
|
||||
|
||||
# print cp.vl
|
||||
# print(cp.vl)
|
||||
|
||||
while True:
|
||||
cp.update(int(sec_since_boot()*1e9), True)
|
||||
# print cp.vl
|
||||
# print(cp.vl)
|
||||
print(cp.ts)
|
||||
print(cp.can_valid)
|
||||
time.sleep(0.01)
|
||||
|
|
|
@ -78,7 +78,7 @@ class CANParser(object):
|
|||
msg_vl = fix(ck_portion, msg)
|
||||
# compare recalculated vs received checksum
|
||||
if msg_vl != cdat:
|
||||
print "CHECKSUM FAIL: " + hex(msg)
|
||||
print("CHECKSUM FAIL: {0}".format(hex(msg)))
|
||||
self.ck[msg] = False
|
||||
self.ok[msg] = False
|
||||
# counter check
|
||||
|
@ -87,13 +87,13 @@ class CANParser(object):
|
|||
cn = out["COUNTER"]
|
||||
# check counter validity if it's a relevant message
|
||||
if cn != ((self.cn[msg] + 1) % 4) and msg in self.msgs_ck and "COUNTER" in out.keys():
|
||||
#print hex(msg), "FAILED COUNTER!"
|
||||
#print("FAILED COUNTER: {0}".format(hex(msg)()
|
||||
self.cn_vl[msg] += 1 # counter check failed
|
||||
else:
|
||||
self.cn_vl[msg] -= 1 # counter check passed
|
||||
# message status is invalid if we received too many wrong counter values
|
||||
if self.cn_vl[msg] >= cn_vl_max:
|
||||
print "COUNTER WRONG: " + hex(msg)
|
||||
print("COUNTER WRONG: {0}".format(hex(msg)))
|
||||
self.ok[msg] = False
|
||||
|
||||
# update msg time stamps and counter value
|
||||
|
@ -118,7 +118,7 @@ class CANParser(object):
|
|||
self.can_valid = True
|
||||
|
||||
if False in self.ok.values():
|
||||
#print "CAN INVALID!"
|
||||
#print("CAN INVALID!")
|
||||
self.can_valid = False
|
||||
|
||||
return msgs_upd
|
||||
|
|
|
@ -1,68 +1,89 @@
|
|||
#!/usr/bin/env python
|
||||
import os
|
||||
import glob
|
||||
import sys
|
||||
|
||||
import six
|
||||
import jinja2
|
||||
|
||||
from collections import Counter
|
||||
from common.dbc import dbc
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
print "usage: %s dbc_path struct_path" % (sys.argv[0],)
|
||||
sys.exit(0)
|
||||
def main():
|
||||
if len(sys.argv) != 3:
|
||||
print "usage: %s dbc_directory output_directory" % (sys.argv[0],)
|
||||
sys.exit(0)
|
||||
|
||||
dbc_fn = sys.argv[1]
|
||||
out_fn = sys.argv[2]
|
||||
dbc_dir = sys.argv[1]
|
||||
out_dir = sys.argv[2]
|
||||
|
||||
template_fn = os.path.join(os.path.dirname(__file__), "dbc_template.cc")
|
||||
template_fn = os.path.join(os.path.dirname(__file__), "dbc_template.cc")
|
||||
template_mtime = os.path.getmtime(template_fn)
|
||||
|
||||
can_dbc = dbc(dbc_fn)
|
||||
this_file_mtime = os.path.getmtime(__file__)
|
||||
|
||||
with open(template_fn, "r") as template_f:
|
||||
template = jinja2.Template(template_f.read(), trim_blocks=True, lstrip_blocks=True)
|
||||
with open(template_fn, "r") as template_f:
|
||||
template = jinja2.Template(template_f.read(), trim_blocks=True, lstrip_blocks=True)
|
||||
|
||||
msgs = [(address, msg_name, msg_size, sorted(msg_sigs, key=lambda s: s.name not in ("COUNTER", "CHECKSUM"))) # process counter and checksums first
|
||||
for address, ((msg_name, msg_size), msg_sigs) in sorted(can_dbc.msgs.iteritems()) if msg_sigs]
|
||||
for dbc_path in glob.iglob(os.path.join(dbc_dir, "*.dbc")):
|
||||
dbc_mtime = os.path.getmtime(dbc_path)
|
||||
dbc_fn = os.path.split(dbc_path)[1]
|
||||
dbc_name = os.path.splitext(dbc_fn)[0]
|
||||
can_dbc = dbc(dbc_path)
|
||||
out_fn = os.path.join(os.path.dirname(__file__), out_dir, dbc_name + ".cc")
|
||||
if os.path.exists(out_fn):
|
||||
out_mtime = os.path.getmtime(out_fn)
|
||||
else:
|
||||
out_mtime = 0
|
||||
|
||||
def_vals = {a: set(b) for a,b in can_dbc.def_vals.items()} #remove duplicates
|
||||
def_vals = [(address, sig) for address, sig in sorted(def_vals.iteritems())]
|
||||
if dbc_mtime < out_mtime and template_mtime < out_mtime and this_file_mtime < out_mtime:
|
||||
continue #skip output is newer than template and dbc
|
||||
|
||||
if can_dbc.name.startswith("honda") or can_dbc.name.startswith("acura"):
|
||||
checksum_type = "honda"
|
||||
checksum_size = 4
|
||||
elif can_dbc.name.startswith("toyota") or can_dbc.name.startswith("lexus"):
|
||||
checksum_type = "toyota"
|
||||
checksum_size = 8
|
||||
else:
|
||||
checksum_type = None
|
||||
msgs = [(address, msg_name, msg_size, sorted(msg_sigs, key=lambda s: s.name not in ("COUNTER", "CHECKSUM"))) # process counter and checksums first
|
||||
for address, ((msg_name, msg_size), msg_sigs) in sorted(six.iteritems(can_dbc.msgs)) if msg_sigs]
|
||||
|
||||
for address, msg_name, msg_size, sigs in msgs:
|
||||
for sig in sigs:
|
||||
if checksum_type is not None and sig.name == "CHECKSUM":
|
||||
if sig.size != checksum_size:
|
||||
sys.exit("CHECKSUM is not %d bits longs %s" % (checksum_size, msg_name))
|
||||
if checksum_type == "honda" and sig.start_bit % 8 != 3:
|
||||
sys.exit("CHECKSUM starts at wrong bit %s" % msg_name)
|
||||
if checksum_type == "toyota" and sig.start_bit % 8 != 7:
|
||||
sys.exit("CHECKSUM starts at wrong bit %s" % msg_name)
|
||||
if checksum_type == "honda" and sig.name == "COUNTER":
|
||||
if sig.size != 2:
|
||||
sys.exit("COUNTER is not 2 bits longs %s" % msg_name)
|
||||
if sig.start_bit % 8 != 5:
|
||||
sys.exit("COUNTER starts at wrong bit %s" % msg_name)
|
||||
if address in [0x200, 0x201]:
|
||||
if sig.name == "COUNTER_PEDAL" and sig.size != 4:
|
||||
sys.exit("PEDAL COUNTER is not 4 bits longs %s" % msg_name)
|
||||
if sig.name == "CHECKSUM_PEDAL" and sig.size != 8:
|
||||
sys.exit("PEDAL CHECKSUM is not 8 bits longs %s" % msg_name)
|
||||
def_vals = {a: set(b) for a,b in can_dbc.def_vals.items()} #remove duplicates
|
||||
def_vals = [(address, sig) for address, sig in sorted(six.iteritems(def_vals))]
|
||||
|
||||
# Fail on duplicate message names
|
||||
c = Counter([msg_name for address, msg_name, msg_size, sigs in msgs])
|
||||
for name, count in c.items():
|
||||
if count > 1:
|
||||
sys.exit("Duplicate message name in DBC file %s" % name)
|
||||
if can_dbc.name.startswith("honda") or can_dbc.name.startswith("acura"):
|
||||
checksum_type = "honda"
|
||||
checksum_size = 4
|
||||
elif can_dbc.name.startswith("toyota") or can_dbc.name.startswith("lexus"):
|
||||
checksum_type = "toyota"
|
||||
checksum_size = 8
|
||||
else:
|
||||
checksum_type = None
|
||||
|
||||
parser_code = template.render(dbc=can_dbc, checksum_type=checksum_type, msgs=msgs, def_vals=def_vals, len=len)
|
||||
for address, msg_name, msg_size, sigs in msgs:
|
||||
for sig in sigs:
|
||||
if checksum_type is not None and sig.name == "CHECKSUM":
|
||||
if sig.size != checksum_size:
|
||||
sys.exit("CHECKSUM is not %d bits longs %s" % (checksum_size, msg_name))
|
||||
if checksum_type == "honda" and sig.start_bit % 8 != 3:
|
||||
sys.exit("CHECKSUM starts at wrong bit %s" % msg_name)
|
||||
if checksum_type == "toyota" and sig.start_bit % 8 != 7:
|
||||
sys.exit("CHECKSUM starts at wrong bit %s" % msg_name)
|
||||
if checksum_type == "honda" and sig.name == "COUNTER":
|
||||
if sig.size != 2:
|
||||
sys.exit("COUNTER is not 2 bits longs %s" % msg_name)
|
||||
if sig.start_bit % 8 != 5:
|
||||
sys.exit("COUNTER starts at wrong bit %s" % msg_name)
|
||||
if address in [0x200, 0x201]:
|
||||
if sig.name == "COUNTER_PEDAL" and sig.size != 4:
|
||||
sys.exit("PEDAL COUNTER is not 4 bits longs %s" % msg_name)
|
||||
if sig.name == "CHECKSUM_PEDAL" and sig.size != 8:
|
||||
sys.exit("PEDAL CHECKSUM is not 8 bits longs %s" % msg_name)
|
||||
|
||||
with open(out_fn, "w") as out_f:
|
||||
out_f.write(parser_code)
|
||||
# Fail on duplicate message names
|
||||
c = Counter([msg_name for address, msg_name, msg_size, sigs in msgs])
|
||||
for name, count in c.items():
|
||||
if count > 1:
|
||||
sys.exit("Duplicate message name in DBC file %s" % name)
|
||||
|
||||
parser_code = template.render(dbc=can_dbc, checksum_type=checksum_type, msgs=msgs, def_vals=def_vals, len=len)
|
||||
|
||||
|
||||
with open(out_fn, "w") as out_f:
|
||||
out_f.write(parser_code)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
|
|
@ -2,9 +2,9 @@ from cereal import car
|
|||
from selfdrive.boardd.boardd import can_list_to_can_capnp
|
||||
from selfdrive.car import apply_toyota_steer_torque_limits
|
||||
from selfdrive.car.chrysler.chryslercan import create_lkas_hud, create_lkas_command, \
|
||||
create_wheel_buttons, create_lkas_heartbit, \
|
||||
create_wheel_buttons, \
|
||||
create_chimes
|
||||
from selfdrive.car.chrysler.values import ECU
|
||||
from selfdrive.car.chrysler.values import ECU, CAR
|
||||
from selfdrive.can.packer import CANPacker
|
||||
|
||||
AudibleAlert = car.CarControl.HUDControl.AudibleAlert
|
||||
|
@ -29,6 +29,7 @@ class CarController(object):
|
|||
self.car_fingerprint = car_fingerprint
|
||||
self.alert_active = False
|
||||
self.send_chime = False
|
||||
self.gone_fast_yet = False
|
||||
|
||||
self.fake_ecus = set()
|
||||
if enable_camera:
|
||||
|
@ -39,8 +40,8 @@ class CarController(object):
|
|||
|
||||
def update(self, sendcan, enabled, CS, frame, actuators,
|
||||
pcm_cancel_cmd, hud_alert, audible_alert):
|
||||
|
||||
# this seems needed to avoid steering faults and to force the sync with the EPS counter
|
||||
frame = CS.lkas_counter
|
||||
if self.prev_frame == frame:
|
||||
return
|
||||
|
||||
|
@ -51,6 +52,11 @@ class CarController(object):
|
|||
CS.steer_torque_motor, SteerLimitParams)
|
||||
|
||||
moving_fast = CS.v_ego > CS.CP.minSteerSpeed # for status message
|
||||
if CS.v_ego > (CS.CP.minSteerSpeed - 0.5): # for command high bit
|
||||
self.gone_fast_yet = True
|
||||
elif self.car_fingerprint in (CAR.PACIFICA_2019_HYBRID, CAR.JEEP_CHEROKEE_2019):
|
||||
if CS.v_ego < (CS.CP.minSteerSpeed - 3.0):
|
||||
self.gone_fast_yet = False # < 14.5m/s stock turns off this bit, but fine down to 13.5
|
||||
lkas_active = moving_fast and enabled
|
||||
|
||||
if not lkas_active:
|
||||
|
@ -76,18 +82,17 @@ class CarController(object):
|
|||
new_msg = create_wheel_buttons(self.ccframe)
|
||||
can_sends.append(new_msg)
|
||||
|
||||
# LKAS_HEARTBIT is forwarded by Panda so no need to send it here.
|
||||
# frame is 100Hz (0.01s period)
|
||||
if (self.ccframe % 10 == 0): # 0.1s period
|
||||
new_msg = create_lkas_heartbit(self.car_fingerprint)
|
||||
can_sends.append(new_msg)
|
||||
|
||||
if (self.ccframe % 25 == 0): # 0.25s period
|
||||
new_msg = create_lkas_hud(self.packer, CS.gear_shifter, lkas_active, hud_alert, self.car_fingerprint,
|
||||
self.hud_count)
|
||||
can_sends.append(new_msg)
|
||||
self.hud_count += 1
|
||||
if (CS.lkas_car_model != -1):
|
||||
new_msg = create_lkas_hud(
|
||||
self.packer, CS.gear_shifter, lkas_active, hud_alert,
|
||||
self.hud_count, CS.lkas_car_model)
|
||||
can_sends.append(new_msg)
|
||||
self.hud_count += 1
|
||||
|
||||
new_msg = create_lkas_command(self.packer, int(apply_steer), frame)
|
||||
new_msg = create_lkas_command(self.packer, int(apply_steer), self.gone_fast_yet, frame)
|
||||
can_sends.append(new_msg)
|
||||
|
||||
self.ccframe += 1
|
||||
|
|
|
@ -63,6 +63,18 @@ def get_can_parser(CP):
|
|||
|
||||
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)
|
||||
|
||||
def get_camera_parser(CP):
|
||||
signals = [
|
||||
# sig_name, sig_address, default
|
||||
# TODO read in all the other values
|
||||
("COUNTER", "LKAS_COMMAND", -1),
|
||||
("CAR_MODEL", "LKAS_HUD", -1),
|
||||
("LKAS_STATUS_OK", "LKAS_HEARTBIT", -1)
|
||||
]
|
||||
checks = []
|
||||
|
||||
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)
|
||||
|
||||
|
||||
class CarState(object):
|
||||
def __init__(self, CP):
|
||||
|
@ -85,7 +97,7 @@ class CarState(object):
|
|||
self.v_ego = 0.0
|
||||
|
||||
|
||||
def update(self, cp):
|
||||
def update(self, cp, cp_cam):
|
||||
# copy can_valid
|
||||
self.can_valid = cp.can_valid
|
||||
|
||||
|
@ -142,3 +154,7 @@ class CarState(object):
|
|||
self.pcm_acc_status = self.main_on
|
||||
|
||||
self.generic_toggle = bool(cp.vl["STEERING_LEVERS"]['HIGH_BEAM_FLASH'])
|
||||
|
||||
self.lkas_counter = cp_cam.vl["LKAS_COMMAND"]['COUNTER']
|
||||
self.lkas_car_model = cp_cam.vl["LKAS_HUD"]['CAR_MODEL']
|
||||
self.lkas_status_ok = cp_cam.vl["LKAS_HEARTBIT"]['LKAS_STATUS_OK']
|
||||
|
|
|
@ -1,18 +1,9 @@
|
|||
from cereal import car
|
||||
from selfdrive.car.chrysler.values import CAR
|
||||
|
||||
|
||||
VisualAlert = car.CarControl.HUDControl.VisualAlert
|
||||
AudibleAlert = car.CarControl.HUDControl.AudibleAlert
|
||||
|
||||
MODEL_TO_CONSTANT = {
|
||||
CAR.PACIFICA_2017_HYBRID: 0,
|
||||
CAR.PACIFICA_2018: 0x64,
|
||||
CAR.PACIFICA_2018_HYBRID: 0xa8,
|
||||
CAR.PACIFICA_2019_HYBRID: 0x68,
|
||||
CAR.JEEP_CHEROKEE: 0xa4,
|
||||
}
|
||||
|
||||
def calc_checksum(data):
|
||||
"""This function does not want the checksum byte in the input data.
|
||||
|
||||
|
@ -21,8 +12,8 @@ def calc_checksum(data):
|
|||
end_index = len(data)
|
||||
index = 0
|
||||
checksum = 0xFF
|
||||
temp_chk = 0;
|
||||
bit_sum = 0;
|
||||
temp_chk = 0
|
||||
bit_sum = 0
|
||||
if(end_index <= index):
|
||||
return False
|
||||
for index in range(0, end_index):
|
||||
|
@ -31,7 +22,7 @@ def calc_checksum(data):
|
|||
iterate = 8
|
||||
while(iterate > 0):
|
||||
iterate -= 1
|
||||
bit_sum = curr & shift;
|
||||
bit_sum = curr & shift
|
||||
temp_chk = checksum & 0x80
|
||||
if (bit_sum != 0):
|
||||
bit_sum = 0x1C
|
||||
|
@ -53,28 +44,20 @@ def calc_checksum(data):
|
|||
def make_can_msg(addr, dat):
|
||||
return [addr, 0, dat, 0]
|
||||
|
||||
def create_lkas_heartbit(car_fingerprint):
|
||||
# LKAS_HEARTBIT (729) Lane-keeping heartbeat.
|
||||
msg = '0000000820'.decode('hex') # 2017
|
||||
return make_can_msg(0x2d9, msg)
|
||||
|
||||
def create_lkas_hud(packer, gear, lkas_active, hud_alert, car_fingerprint, hud_count):
|
||||
def create_lkas_hud(packer, gear, lkas_active, hud_alert, hud_count, lkas_car_model):
|
||||
# LKAS_HUD 0x2a6 (678) Controls what lane-keeping icon is displayed.
|
||||
|
||||
if hud_alert == VisualAlert.steerRequired:
|
||||
msg = '0000000300000000'.decode('hex')
|
||||
return make_can_msg(0x2a6, msg)
|
||||
|
||||
color = 0 # default values are for park or neutral
|
||||
lines = 0
|
||||
color = 1 # default values are for park or neutral in 2017 are 0 0, but trying 1 1 for 2019
|
||||
lines = 1
|
||||
alerts = 0
|
||||
|
||||
if hud_count < (3 *4): # first 3 seconds, 4Hz
|
||||
lines = 1
|
||||
if hud_count < (1 *4): # first 3 seconds, 4Hz
|
||||
alerts = 1
|
||||
elif hud_count < (6 * 4): # next 3 seconds, 4Hz
|
||||
lines = 1
|
||||
alerts = 0
|
||||
# CAR.PACIFICA_2018_HYBRID and CAR.PACIFICA_2019_HYBRID
|
||||
# had color = 1 and lines = 1 but trying 2017 hybrid style for now.
|
||||
if gear in ('drive', 'reverse', 'low'):
|
||||
|
@ -87,7 +70,7 @@ def create_lkas_hud(packer, gear, lkas_active, hud_alert, car_fingerprint, hud_c
|
|||
|
||||
values = {
|
||||
"LKAS_ICON_COLOR": color, # byte 0, last 2 bits
|
||||
"CAR_MODEL": MODEL_TO_CONSTANT[car_fingerprint], # byte 1
|
||||
"CAR_MODEL": lkas_car_model, # byte 1
|
||||
"LKAS_LANE_LINES": lines, # byte 2, last 4 bits
|
||||
"LKAS_ALERTS": alerts, # byte 3, last 4 bits
|
||||
}
|
||||
|
@ -95,11 +78,11 @@ def create_lkas_hud(packer, gear, lkas_active, hud_alert, car_fingerprint, hud_c
|
|||
return packer.make_can_msg("LKAS_HUD", 0, values) # 0x2a6
|
||||
|
||||
|
||||
def create_lkas_command(packer, apply_steer, frame):
|
||||
# LKAS_COMMAND (658) Lane-keeping signal to turn the wheel.
|
||||
def create_lkas_command(packer, apply_steer, moving_fast, frame):
|
||||
# LKAS_COMMAND 0x292 (658) Lane-keeping signal to turn the wheel.
|
||||
values = {
|
||||
"LKAS_STEERING_TORQUE": apply_steer,
|
||||
"LKAS_HIGH_TORQUE": 1,
|
||||
"LKAS_HIGH_TORQUE": int(moving_fast),
|
||||
"COUNTER": frame % 0x10,
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import chryslercan
|
||||
from values import CAR
|
||||
from selfdrive.car.chrysler import chryslercan
|
||||
from selfdrive.can.packer import CANPacker
|
||||
|
||||
from cereal import car
|
||||
|
@ -15,33 +14,47 @@ class TestChryslerCan(unittest.TestCase):
|
|||
self.assertEqual(0x75, chryslercan.calc_checksum([0x01, 0x20]))
|
||||
self.assertEqual(0xcc, chryslercan.calc_checksum([0x14, 0, 0, 0, 0x20]))
|
||||
|
||||
def test_heartbit(self):
|
||||
self.assertEqual(
|
||||
[0x2d9, 0, '0000000820'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_heartbit(CAR.PACIFICA_2017_HYBRID))
|
||||
|
||||
def test_hud(self):
|
||||
packer = CANPacker('chrysler_pacifica_2017_hybrid')
|
||||
self.assertEqual(
|
||||
[0x2a6, 0, '0000010100000000'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_hud(packer,
|
||||
'park', False, False, CAR.PACIFICA_2017_HYBRID, 1))
|
||||
[0x2a6, 0, '0100010100000000'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_hud(
|
||||
packer,
|
||||
'park', False, False, 1, 0))
|
||||
self.assertEqual(
|
||||
[0x2a6, 0, '0000010000000000'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_hud(packer,
|
||||
'park', False, False, CAR.PACIFICA_2017_HYBRID, 5*4))
|
||||
[0x2a6, 0, '0100010000000000'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_hud(
|
||||
packer,
|
||||
'park', False, False, 5*4, 0))
|
||||
self.assertEqual(
|
||||
[0x2a6, 0, '0000000000000000'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_hud(packer,
|
||||
'park', False, False, CAR.PACIFICA_2017_HYBRID, 99999))
|
||||
[0x2a6, 0, '0100010000000000'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_hud(
|
||||
packer,
|
||||
'park', False, False, 99999, 0))
|
||||
self.assertEqual(
|
||||
[0x2a6, 0, '0200060000000000'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_hud(packer,
|
||||
'drive', True, False, CAR.PACIFICA_2017_HYBRID, 99999))
|
||||
chryslercan.create_lkas_hud(
|
||||
packer,
|
||||
'drive', True, False, 99999, 0))
|
||||
self.assertEqual(
|
||||
[0x2a6, 0, '0264060000000000'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_hud(packer,
|
||||
'drive', True, False, CAR.PACIFICA_2018, 99999))
|
||||
chryslercan.create_lkas_hud(
|
||||
packer,
|
||||
'drive', True, False, 99999, 0x64))
|
||||
|
||||
def test_command(self):
|
||||
packer = CANPacker('chrysler_pacifica_2017_hybrid')
|
||||
self.assertEqual(
|
||||
[0x292, 0, '140000001086'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_command(
|
||||
packer,
|
||||
0, True, 1))
|
||||
self.assertEqual(
|
||||
[0x292, 0, '040000008083'.decode('hex'), 0],
|
||||
chryslercan.create_lkas_command(
|
||||
packer,
|
||||
0, False, 8))
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
|
|
@ -4,7 +4,7 @@ from cereal import car
|
|||
from selfdrive.config import Conversions as CV
|
||||
from selfdrive.controls.lib.drive_helpers import EventTypes as ET, create_event
|
||||
from selfdrive.controls.lib.vehicle_model import VehicleModel
|
||||
from selfdrive.car.chrysler.carstate import CarState, get_can_parser
|
||||
from selfdrive.car.chrysler.carstate import CarState, get_can_parser, get_camera_parser
|
||||
from selfdrive.car.chrysler.values import ECU, check_ecu_msgs, CAR
|
||||
|
||||
try:
|
||||
|
@ -27,8 +27,8 @@ class CarInterface(object):
|
|||
|
||||
# *** init the major players ***
|
||||
self.CS = CarState(CP)
|
||||
|
||||
self.cp = get_can_parser(CP)
|
||||
self.cp_cam = get_camera_parser(CP)
|
||||
|
||||
# sending if read only is False
|
||||
if sendcan is not None:
|
||||
|
@ -79,7 +79,7 @@ class CarInterface(object):
|
|||
ret.steerActuatorDelay = 0.1
|
||||
ret.steerRateCost = 0.7
|
||||
|
||||
if candidate == CAR.JEEP_CHEROKEE:
|
||||
if candidate in (CAR.JEEP_CHEROKEE, CAR.JEEP_CHEROKEE_2019):
|
||||
ret.wheelbase = 2.91 # in meters
|
||||
ret.steerRatio = 12.7
|
||||
ret.steerActuatorDelay = 0.2 # in seconds
|
||||
|
@ -91,6 +91,9 @@ class CarInterface(object):
|
|||
|
||||
ret.minSteerSpeed = 3.8 # m/s
|
||||
ret.minEnableSpeed = -1. # enable is done by stock ACC, so ignore this
|
||||
if candidate in (CAR.PACIFICA_2019_HYBRID, CAR.JEEP_CHEROKEE_2019):
|
||||
ret.minSteerSpeed = 17.5 # m/s 17 on the way up, 13 on the way down once engaged.
|
||||
# TODO allow 2019 cars to steer down to 13 m/s if already engaged.
|
||||
|
||||
centerToRear = ret.wheelbase - ret.centerToFront
|
||||
# TODO: get actual value, for now starting with reasonable value for
|
||||
|
@ -119,7 +122,7 @@ class CarInterface(object):
|
|||
ret.brakeMaxV = [1., 0.8]
|
||||
|
||||
ret.enableCamera = not check_ecu_msgs(fingerprint, ECU.CAM)
|
||||
print "ECU Camera Simulated: ", ret.enableCamera
|
||||
print("ECU Camera Simulated: {0}".format(ret.enableCamera))
|
||||
ret.openpilotLongitudinalControl = False
|
||||
|
||||
ret.steerLimitAlert = True
|
||||
|
@ -137,10 +140,9 @@ class CarInterface(object):
|
|||
def update(self, c):
|
||||
# ******************* do can recv *******************
|
||||
canMonoTimes = []
|
||||
|
||||
self.cp.update(int(sec_since_boot() * 1e9), False)
|
||||
|
||||
self.CS.update(self.cp)
|
||||
self.cp_cam.update(int(sec_since_boot() * 1e9), False)
|
||||
self.CS.update(self.cp, self.cp_cam)
|
||||
|
||||
# create message
|
||||
ret = car.CarState.new_message()
|
||||
|
@ -208,6 +210,8 @@ class CarInterface(object):
|
|||
self.low_speed_alert = (ret.vEgo < self.CP.minSteerSpeed)
|
||||
|
||||
ret.genericToggle = self.CS.generic_toggle
|
||||
#ret.lkasCounter = self.CS.lkas_counter
|
||||
#ret.lkasCarModel = self.CS.lkas_car_model
|
||||
|
||||
# events
|
||||
events = []
|
||||
|
|
|
@ -25,29 +25,29 @@ def _create_radard_can_parser():
|
|||
|
||||
# The factor and offset are applied by the dbc parsing library, so the
|
||||
# default values should be after the factor/offset are applied.
|
||||
signals = zip(['LONG_DIST'] * msg_n +
|
||||
signals = list(zip(['LONG_DIST'] * msg_n +
|
||||
['LAT_DIST'] * msg_n +
|
||||
['REL_SPEED'] * msg_n,
|
||||
RADAR_MSGS_C * 2 + # LONG_DIST, LAT_DIST
|
||||
RADAR_MSGS_D, # REL_SPEED
|
||||
[0] * msg_n + # LONG_DIST
|
||||
[-1000] * msg_n + # LAT_DIST
|
||||
[-146.278] * msg_n) # REL_SPEED set to 0, factor/offset to this
|
||||
[-146.278] * msg_n)) # REL_SPEED set to 0, factor/offset to this
|
||||
# TODO what are the checks actually used for?
|
||||
# honda only checks the last message,
|
||||
# toyota checks all the messages. Which do we want?
|
||||
checks = zip(RADAR_MSGS_C +
|
||||
checks = list(zip(RADAR_MSGS_C +
|
||||
RADAR_MSGS_D,
|
||||
[20]*msg_n + # 20Hz (0.05s)
|
||||
[20]*msg_n) # 20Hz (0.05s)
|
||||
[20]*msg_n)) # 20Hz (0.05s)
|
||||
|
||||
return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1)
|
||||
|
||||
def _address_to_track(address):
|
||||
if address in RADAR_MSGS_C:
|
||||
return (address - RADAR_MSGS_C[0]) / 2
|
||||
return (address - RADAR_MSGS_C[0]) // 2
|
||||
if address in RADAR_MSGS_D:
|
||||
return (address - RADAR_MSGS_D[0]) / 2
|
||||
return (address - RADAR_MSGS_D[0]) // 2
|
||||
raise ValueError("radar received unexpected address %d" % address)
|
||||
|
||||
class RadarInterface(object):
|
||||
|
@ -104,4 +104,4 @@ if __name__ == "__main__":
|
|||
while 1:
|
||||
ret = RI.update()
|
||||
print(chr(27) + "[2J") # clear screen
|
||||
print ret
|
||||
print(ret)
|
||||
|
|
|
@ -6,6 +6,7 @@ class CAR:
|
|||
PACIFICA_2019_HYBRID = "CHRYSLER PACIFICA HYBRID 2019"
|
||||
PACIFICA_2018 = "CHRYSLER PACIFICA 2018"
|
||||
JEEP_CHEROKEE = "JEEP GRAND CHEROKEE V6 2018" # Also covers Tailhawk 2017.
|
||||
JEEP_CHEROKEE_2019 = "JEEP GRAND CHEROKEE 2019"
|
||||
|
||||
# Unique can messages:
|
||||
# Only the hybrids have 270: 8
|
||||
|
@ -24,11 +25,9 @@ FINGERPRINTS = {
|
|||
],
|
||||
CAR.PACIFICA_2018: [
|
||||
{55: 8, 257: 5, 258: 8, 264: 8, 268: 8, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 292: 8, 294: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 368: 8, 376: 3, 384: 8, 388: 4, 416: 7, 448: 6, 456: 4, 464: 8, 469: 8, 480: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 528: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 4, 564: 8, 571: 3, 579: 8, 584: 8, 608: 8, 624: 8, 625: 8, 632: 8, 639: 8, 658: 6, 660: 8, 669: 3, 671: 8, 672: 8, 678: 8, 680: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 729: 5, 736: 8, 746: 5, 752: 2, 760: 8, 764: 8, 766: 8, 770: 8, 773: 8, 779: 8, 784: 8, 792: 8, 799: 8, 800: 8, 804: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 832: 8, 838: 2, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 882: 8, 897: 8, 924: 8, 926: 3, 937: 8, 947: 8, 948: 8, 969: 4, 974: 5, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1098: 8, 1100: 8},
|
||||
|
||||
],
|
||||
CAR.PACIFICA_2018_HYBRID: [
|
||||
{68: 8, 257: 5, 258: 8, 264: 8, 268: 8, 270: 8, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 291: 8, 292: 8, 294: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 368: 8, 376: 3, 384: 8, 388: 4, 448: 6, 456: 4, 464: 8, 469: 8, 480: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 528: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 4, 564: 8, 571: 3, 579: 8, 584: 8, 608: 8, 624: 8, 625: 8, 632: 8, 639: 8, 653: 8, 654: 8, 655: 8, 660: 8, 669: 3, 671: 8, 672: 8, 680: 8, 701: 8, 704: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 736: 8, 737: 8, 746: 5, 760: 8, 764: 8, 766: 8, 770: 8, 773: 8, 779: 8, 782: 8, 784: 8, 792: 8, 799: 8, 800: 8, 804: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 832: 8, 838: 2, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 878: 8, 882: 8, 897: 8, 908: 8, 924: 8, 926: 3, 929: 8, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 958: 8, 959: 8, 969: 4, 974: 5, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1082: 8, 1083: 8, 1098: 8, 1100: 8},
|
||||
{168: 8, 257: 5, 258: 8, 264: 8, 268: 8, 270: 8, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 291: 8, 292: 8, 294: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 368: 8, 376: 3, 384: 8, 388: 4, 448: 6, 456: 4, 464: 8, 469: 8, 480: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 528: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 4, 564: 8, 571: 3, 579: 8, 584: 8, 608: 8, 624: 8, 625: 8, 632: 8, 639: 8, 653: 8, 654: 8, 655: 8, 660: 8, 669: 3, 671: 8, 672: 8, 680: 8, 701: 8, 704: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 736: 8, 737: 8, 746: 5, 760: 8, 764: 8, 766: 8, 770: 8, 773: 8, 779: 8, 782: 8, 784: 8, 792: 8, 799: 8, 800: 8, 804: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 832: 8, 838: 2, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 878: 8, 882: 8, 897: 8, 908: 8, 924: 8, 926: 3, 929: 8, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 958: 8, 959: 8, 969: 4, 974: 5, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1082: 8, 1083: 8, 1098: 8, 1100: 8},
|
||||
{68: 8, 168: 8, 257: 5, 258: 8, 264: 8, 268: 8, 270: 8, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 291: 8, 292: 8, 294: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 368: 8, 376: 3, 384: 8, 388: 4, 448: 6, 456: 4, 464: 8, 469: 8, 480: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 528: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 4, 564: 8, 571: 3, 579: 8, 584: 8, 608: 8, 624: 8, 625: 8, 632: 8, 639: 8, 653: 8, 654: 8, 655: 8, 660: 8, 669: 3, 671: 8, 672: 8, 680: 8, 701: 8, 704: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 736: 8, 737: 8, 746: 5, 760: 8, 764: 8, 766: 8, 770: 8, 773: 8, 779: 8, 782: 8, 784: 8, 792: 8, 799: 8, 800: 8, 804: 8, 808: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 832: 8, 838: 2, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 878: 8, 882: 8, 897: 8, 908: 8, 924: 8, 926: 3, 929: 8, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 958: 8, 959: 8, 969: 4, 974: 5, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1082: 8, 1083: 8, 1098: 8, 1100: 8},
|
||||
],
|
||||
CAR.PACIFICA_2019_HYBRID: [
|
||||
{168: 8, 257: 5, 258: 8, 264: 8, 268: 8, 270: 8, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 291: 8, 292: 8, 294: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 368: 8, 376: 3, 384: 8, 388: 4, 448: 6, 456: 4, 464: 8, 469: 8, 480: 8, 500: 8, 501: 8, 512: 8, 514: 8, 515: 7, 516: 7, 517: 7, 518: 7, 520: 8, 528: 8, 532: 8, 542: 8, 544: 8, 557: 8, 559: 8, 560: 8, 564: 8, 571: 3, 579: 8, 584: 8, 608: 8, 624: 8, 625: 8, 632: 8, 639: 8, 653: 8, 654: 8, 655: 8, 660: 8, 669: 3, 671: 8, 672: 8, 680: 8, 701: 8, 703: 8, 704: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 736: 8, 737: 8, 746: 5, 752: 2, 754: 8, 760: 8, 764: 8, 766: 8, 770:8, 773: 8, 779: 8, 782: 8, 784: 8, 792: 8, 799: 8, 800: 8, 804: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 832: 8, 838: 2, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 878: 8, 882: 8, 897: 8, 906: 8, 908: 8, 924: 8, 926: 3, 929: 8, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 958: 8, 959: 8, 962: 8, 969: 4, 973: 8, 974: 5, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1082: 8, 1083: 8, 1098: 8, 1100: 8, 1538: 8},
|
||||
|
@ -42,6 +41,8 @@ FINGERPRINTS = {
|
|||
{55: 8, 168: 8, 181: 8, 256: 4, 257: 5, 258: 8, 264: 8, 268: 8, 272: 6, 273: 6, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 292: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 352: 8, 362: 8, 368: 8, 376: 3, 384: 8, 388: 4, 416: 7, 448: 6, 456: 4, 464: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 4, 564: 4, 571: 3, 579: 8, 584: 8, 608: 8, 624: 8, 625: 8, 632: 8, 639: 8, 656: 4, 658: 6, 660: 8, 671: 8, 672: 8, 676: 8, 678: 8, 680: 8, 683: 8, 684: 8, 703: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 729: 5, 736: 8, 737: 8, 738: 8, 746: 5, 752: 2, 754: 8, 760: 8, 761: 8, 764: 8, 766: 8, 773: 8, 776: 8, 779: 8, 782: 8, 783: 8, 784: 8, 785: 8, 788: 3, 792: 8, 799: 8, 800: 8, 804: 8, 806: 2, 808: 8, 810: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 831: 6, 832: 8, 838: 2, 844: 5, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 882: 8, 897: 8, 906: 8, 924: 8, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 968: 8, 969: 4, 970: 8, 973: 8, 974: 5, 976: 8, 977: 4, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1062: 8, 1098: 8, 1100: 8},
|
||||
# Jeep Grand Cherokee 2017 Trailhawk
|
||||
{257: 5, 258: 8, 264: 8, 268: 8, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 292: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 352: 8, 362: 8, 368: 8, 376: 3, 384: 8, 388: 4, 416: 7, 448: 6, 456: 4, 464: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 4, 564: 4, 571: 3, 584: 8, 608: 8, 618: 8, 624: 8, 625: 8, 632: 8, 639: 8, 660: 8, 671: 8, 672: 8, 680: 8, 684: 8, 703: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 736: 8, 737: 8, 746: 5, 752: 2, 760: 8, 761: 8, 764: 8, 766: 8, 773: 8, 776: 8, 779: 8, 783: 8, 784: 8, 792: 8, 799: 8, 800: 8, 804: 8, 806: 2, 808: 8, 810: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 831: 6, 832: 8, 838: 2, 844: 5, 848: 8, 853: 8, 856: 4, 860: 6, 863: 8, 882: 8, 897: 8, 924: 3, 937: 8, 947: 8, 948: 8, 969: 4, 974: 5, 977: 4, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1062: 8, 1098: 8, 1100: 8},
|
||||
],
|
||||
CAR.JEEP_CHEROKEE_2019: [
|
||||
# Jeep Grand Cherokee 2019 from Switzerland
|
||||
# 530: 8 is so far only in this Jeep.
|
||||
{55: 8, 181: 8, 256: 4, 257: 5, 258: 8, 264: 8, 268: 8, 272: 6, 273: 6, 274: 2, 280: 8, 284: 8, 288: 7, 290: 6, 292: 8, 300: 8, 308: 8, 320: 8, 324: 8, 331: 8, 332: 8, 344: 8, 352: 8, 362: 8, 368: 8, 376: 3, 384: 8, 388: 4, 416: 7, 448: 6, 456: 4, 464: 8, 500: 8, 501: 8, 512: 8, 514: 8, 520: 8, 530: 8, 532: 8, 544: 8, 557: 8, 559: 8, 560: 8, 564: 8, 571: 3, 579: 8, 584: 8, 608: 8, 618: 8, 624: 8, 625: 8, 632: 8, 639: 8, 660: 8, 671: 8, 672: 8, 676: 8, 680: 8, 683: 8, 684: 8, 703: 8, 705: 8, 706: 8, 709: 8, 710: 8, 719: 8, 720: 6, 736: 8, 737: 8, 738: 8, 746: 5, 752: 2, 754: 8, 760: 8, 761: 8, 764: 8, 773: 8, 776: 8, 779: 8, 782: 8, 783: 8, 784: 8, 792: 8, 799: 8, 804: 8, 806: 2, 808: 8, 816: 8, 817: 8, 820: 8, 825: 2, 826: 8, 831: 6, 832: 8, 838: 2, 844: 5, 848: 8, 853: 8, 856: 4, 860: 6, 882: 8, 897: 8, 906: 8, 924: 8, 937: 8, 938: 8, 939: 8, 940: 8, 941: 8, 942: 8, 943: 8, 947: 8, 948: 8, 968: 8, 969: 4, 970: 8, 973: 8, 974: 5, 977: 4, 979: 8, 980: 8, 981: 8, 982: 8, 983: 8, 984: 8, 992: 8, 993: 7, 995: 8, 996: 8, 1000: 8, 1001: 8, 1002: 8, 1003: 8, 1008: 8, 1009: 8, 1010: 8, 1011: 8, 1012: 8, 1013: 8, 1014: 8, 1015: 8, 1024: 8, 1025: 8, 1026: 8, 1031: 8, 1033: 8, 1050: 8, 1059: 8, 1062: 8, 1098: 8, 1100: 8},
|
||||
|
@ -65,6 +66,9 @@ DBC = {
|
|||
CAR.JEEP_CHEROKEE: dbc_dict( # Same DBC file works.
|
||||
'chrysler_pacifica_2017_hybrid', # 'pt'
|
||||
'chrysler_pacifica_2017_hybrid_private_fusion'), # 'radar'
|
||||
CAR.JEEP_CHEROKEE_2019: dbc_dict( # Same DBC file works.
|
||||
'chrysler_pacifica_2017_hybrid', # 'pt'
|
||||
'chrysler_pacifica_2017_hybrid_private_fusion'), # 'radar'
|
||||
}
|
||||
|
||||
STEER_THRESHOLD = 120
|
||||
|
|
|
@ -6,7 +6,7 @@ from selfdrive.config import Conversions as CV
|
|||
from selfdrive.controls.lib.drive_helpers import EventTypes as ET, create_event
|
||||
from selfdrive.controls.lib.vehicle_model import VehicleModel
|
||||
from selfdrive.car.ford.carstate import CarState, get_can_parser
|
||||
from selfdrive.car.ford.fordcan import MAX_ANGLE
|
||||
from selfdrive.car.ford.values import MAX_ANGLE
|
||||
|
||||
try:
|
||||
from selfdrive.car.ford.carcontroller import CarController
|
||||
|
|
|
@ -14,10 +14,10 @@ RADAR_MSGS = range(0x500, 0x540)
|
|||
def _create_radard_can_parser():
|
||||
dbc_f = 'ford_fusion_2018_adas.dbc'
|
||||
msg_n = len(RADAR_MSGS)
|
||||
signals = zip(['X_Rel'] * msg_n + ['Angle'] * msg_n + ['V_Rel'] * msg_n,
|
||||
RADAR_MSGS * 3,
|
||||
[0] * msg_n + [0] * msg_n + [0] * msg_n)
|
||||
checks = zip(RADAR_MSGS, [20]*msg_n)
|
||||
signals = list(zip(['X_Rel'] * msg_n + ['Angle'] * msg_n + ['V_Rel'] * msg_n,
|
||||
RADAR_MSGS * 3,
|
||||
[0] * msg_n + [0] * msg_n + [0] * msg_n))
|
||||
checks = list(zip(RADAR_MSGS, [20]*msg_n))
|
||||
|
||||
return CANParser(os.path.splitext(dbc_f)[0], signals, checks, 1)
|
||||
|
||||
|
@ -90,4 +90,4 @@ if __name__ == "__main__":
|
|||
while 1:
|
||||
ret = RI.update()
|
||||
print(chr(27) + "[2J")
|
||||
print ret
|
||||
print(ret)
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue