Cleap up, remove other vehicles because I am not maintaining it

This commit is contained in:
Carsten Schmiemann 2022-04-20 21:21:34 +02:00
parent 77e7740e1b
commit fcd3f12b5b
348 changed files with 6 additions and 570794 deletions

View File

@ -1,14 +0,0 @@
#
# Main component makefile.
#
# This Makefile can be left empty. By default, it will take the sources in the
# src/ directory, compile them and link them into lib(subdirectory_name).a
# in the build directory. This behaviour is entirely configurable,
# please read the ESP-IDF documents if you need to do this.
#
ifdef CONFIG_OVMS_VEHICLE_BMWI3
COMPONENT_ADD_INCLUDEDIRS:=src
COMPONENT_SRCDIRS:=src
COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
endif

View File

@ -1,695 +0,0 @@
These JSON files provide a description of some of the ECUs fitted to the BMW i3/i3s.
These files were derived from the Ediasbaslib project and the included
DeepOBD application. Find the project at:
https://github.com/uholeschak/ediabaslib
Both Ediasbaslib and the Deep OBD application are very useful tools that we wholeheartedly
recommend to you. Deep OBD in particular is a powerful tool to assist to understand
the i3 ECUs.
Thank you Ulrich Holeschak and other contributors for making these tools available
with an open-source licence.
Ediasbaslib is licenced with the GPL-3.0 Licence, which I reproduce below. Accordingly,
these derived JSON files are similarly GPL 3.0 licensed.
/* GPL 3.0 Licence */
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,120 +0,0 @@
{
"tables" : {
"RES_0XAD73_R" : [
{
"DATENTYP" : "unsigned char",
"STR" : "-",
"MASKE" : "-",
"NAME" : "TAB_SME_HEIZUNG_FUNKTION",
"INFO" : "Ergebniss der funktionalen Heizungsdiagnose",
"RRR" : "+",
"ADD" : "-",
"MUL" : "-",
"STPR" : "-",
"INFO_EN" : "Result of the functional heating diagnosis",
"RESULTNAME" : "STAT_HEIZUNG_FUNKTION_NR",
"EINHEIT" : "0-n",
"L/H" : "high",
"DIV" : "-"
}
],
"RES_0XAD71_R" : [
{
"EINHEIT" : "V",
"DIV" : "100.0",
"L/H" : "high",
"RESULTNAME" : "STAT_SPANNUNG_MIN_LIM_WERT",
"MUL" : "1.0",
"INFO_EN" : "Limit value for minimum voltage in volts (project-specific UminLim)",
"STPR" : "-",
"NAME" : "-",
"DATENTYP" : "unsigned int",
"STR" : "-",
"MASKE" : "-",
"ADD" : "0.0",
"RRR" : "+",
"INFO" : "Grenzwert für minimale Spannung in Volt (projektspezifischer UminLim)"
},
{
"ADD" : "0.0",
"INFO" : "Grenzwert für maximale Spannung in Volt (projektspezifischer UmaxLim)",
"RRR" : "+",
"NAME" : "-",
"MASKE" : "-",
"STR" : "-",
"DATENTYP" : "unsigned int",
"STPR" : "-",
"INFO_EN" : "Limit value for maximum voltage in volts (project-specific UmaxLim)",
"MUL" : "1.0",
"RESULTNAME" : "STAT_SPANNUNG_MAX_LIM_WERT",
"L/H" : "high",
"DIV" : "100.0",
"EINHEIT" : "V"
},
{
"RESULTNAME" : "STAT_HIS_SPANNUNG_MOD_1_WERT",
"L/H" : "high",
"DIV" : "1.0",
"EINHEIT" : "min",
"RRR" : "+",
"INFO" : "Dauer in Minuten in der Klasse UminLim <= U <= 3.57 (I12) bzw. UminLim <= U <= 3.82 (I01) (SBL)",
"ADD" : "0.0",
"STR" : "-",
"DATENTYP" : "unsigned long",
"MASKE" : "-",
"NAME" : "-",
"STPR" : "-",
"INFO_EN" : "Duration in minutes in the class UminLim <= U <= 3.57 (I12) or UminLim <= U <= 3.82 (I01) (SBL)",
"MUL" : "1.0"
},
{
"ADD" : "0.0",
"INFO" : "Dauer in Minuten in der Klasse 3.57 < U <= 3.77 (I12) bzw. 3.82 < U <= 3.91 (I01) (SBL)",
"RRR" : "+",
"NAME" : "-",
"DATENTYP" : "unsigned long",
"MASKE" : "-",
"STR" : "-",
"INFO_EN" : "Duration in minutes in class 3.57 <U <= 3.77 (I12) or 3.82 <U <= 3.91 (I01) (SBL)",
"STPR" : "-",
"MUL" : "1.0",
"RESULTNAME" : "STAT_HIS_SPANNUNG_MOD_2_WERT",
"DIV" : "1.0",
"L/H" : "high",
"EINHEIT" : "min"
},
{
"EINHEIT" : "min",
"L/H" : "high",
"DIV" : "1.0",
"RESULTNAME" : "STAT_HIS_SPANNUNG_MOD_3_WERT",
"MUL" : "1.0",
"STPR" : "-",
"INFO_EN" : "Duration in minutes in class 3.77 <U <= 3.93 (I12) or 3.91 <U <= 4.03 (I01) (SBL)",
"MASKE" : "-",
"STR" : "-",
"DATENTYP" : "unsigned long",
"NAME" : "-",
"RRR" : "+",
"INFO" : "Dauer in Minuten in der Klasse 3.77 < U <= 3.93 (I12) bzw. 3.91 < U <= 4.03 (I01) (SBL)",
"ADD" : "0.0"
},
{
"RESULTNAME" : "STAT_HIS_SPANNUNG_MOD_4_WERT",
"EINHEIT" : "min",
"DIV" : "1.0",
"L/H" : "high",
"DATENTYP" : "unsigned long",
"MASKE" : "-",
"STR" : "-",
"NAME" : "-",
"RRR" : "+",
"INFO" : "Dauer in Minuten in der Klasse 3.93 < U <= UmaxLim (I12) bzw. 4.03 < U <= UmaxLim (I01) (SBL)",
"ADD" : "0.0",
"MUL" : "1.0",
"STPR" : "-",
"INFO_EN" : "Duration in minutes in class 3.93 <U <= UmaxLim (I12) or 4.03 <U <= UmaxLim (I01) (SBL)"
}
]
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,171 +0,0 @@
=============
BMW i3 / i3s
=============
Vehicle Type: **BMWI3**
This vehicle type supports the BMW i3 and i3s models. All model years should be supported.
The OVMS support was developed Jan 2021.
It was developed against the author's 2018 120Ah i3s BEV. I would welcome engagement from
the owner of a REX type to further develop metrics related to the REX engine. Testing by
drivers of LHD models, as well as those with the smaller batteries will also be helpful.
As of this release this vehicle support is read-only and cannot send commands to the car.
----------------
Support Overview
----------------
"tba" item are still on the to-do list and are not currently supported.
=========================== ==============
Function Support Status
=========================== ==============
Hardware Any OVMS v3 (or later) module.
Vehicle Cable OBD-II cable: left-handed cable worked best in my RHD car
GSM Antenna 1000500 Open Vehicles OVMS GSM Antenna (or any compatible antenna)
GPS Antenna 1020200 Universal GPS Antenna (or any compatible antenna)
SOC Display Yes
Range Display Yes
Cabin Pre-heat/cool Control tba
GPS Location Yes (from modem module GPS)
Speed Display Yes
Temperature Display Yes
BMS v+t Display Yes
TPMS Display tba
Charge Status Display Yes
Charge Interruption Alerts Yes
Charge Control tba
Lock/Unlock Vehicle tba
Valet Mode Control No
Others 12v battery voltage/current, battery true SOC, etc
=========================== ==============
--------
WARNINGS
--------
Alarm behaviour
^^^^^^^^^^^^^^^
As standard, the i3 will sound the alarm if anything is left connected to the OBD-II
port when the car is locked.
A tool like Bimmercode will allow you to disable this. Alternatively
you will need to disconnect the OVMS unit before locking the car.
A future version may add a command to allow you to disable this alarm directly
from your OVMS shell.
12V Battery drain
^^^^^^^^^^^^^^^^^
The i3 has a small 20Ah AGM 12v battery. Whilst care has been taken to minimize OVMS' power usage,
OVMS could eventually drain this battery if the car is left unplugged and locked.
OVMS will also send an alert if 12V drops under 12V alert threshold. (See 12V Calibration section).
HOWEVER: If you are going to leave the car for a fews days, it is recommended to unplug OVMS.
----------
Car status
----------
The car is accessible over the OBD-II port when it is running (ignition on) and for a short time
(40 seconds or so) after it is turned off or the car is "tweaked" (lock button pushed,
connected-drive command received, etc).
Unfortunately this means that when your car is standing or charging OVMS only has
intermittent access to data from the car.
By observation, whilst the car is charging it wakes up now and then (seems to be every 30 minutes).
So at those times we can update our SOC etc.
Metrics "v.e.awake" tells you if the car is awake or not. Metric "xi3.s.age" will tell you how
many minutes have passed since we last received data from the car.
You may also refer to metric xi3.s.pollermode as follows:
==== ================================================
Mode Meaning
==== ================================================
0 Car is asleep - no OBD-II data traffic
1 Car OBD-II is awake - we are seeing data traffic
2 Car is ready to drive or driving
3 Car is charging
==== ================================================
-------------------
Custom metrics
-------------------
======================================== =================== =====================================================================================================
Metric name Example value Description
======================================== =================== =====================================================================================================
xi3.s.age 5Min How long since we last got data from the car
xi3.s.pollermode 0 OBD-II polling mode as explained above
xi3.v.b.p.ocv.avg 4.0646V Main battery pack - average open-circuit voltage
xi3.v.b.p.ocv.max 4.067V Main battery pack - highest open-circuit voltage
xi3.v.b.p.ocv.min 4.063V Main battery pack - lowest open-circuit voltage
xi3.v.b.range.bc 245km Available range per trip computer (based on current driving mode and style)
xi3.v.b.range.comfort 217km Available range if you use Comfort mode
xi3.v.b.range.ecopro 245km Available range if you use EcoPro mode
xi3.v.b.range.ecoproplus 247km Available range if you use EcoPro+ mode
xi3.v.b.soc.actual 85% Actual physical state-of-charge of the main battery pack
xi3.v.b.soc.actual.highlimit 93.7% Highest physical charge level permitted (shown as 100% SOC)
xi3.v.b.soc.actual.lowlimit 10.5% Minimum physical charge level permitted (shown as 0% SOC)
xi3.v.c.chargecablecapacity 0A Maximum power capacity of connected charge cable per the charging interface
xi3.v.c.chargeledstate 0 Colour of the "ring light" on the charging interface.
xi3.v.c.chargeplugstatus Not connected Charging cable connected?
xi3.v.c.current.dc 0A Power flowing on the DC side of the AC charger
xi3.v.c.current.dc.limit 0.100003A Limit
xi3.v.c.current.dc.maxlimit 16A Maximum limit
xi3.v.c.current.phase1 0A Power being drawn on AC phase 1
xi3.v.c.current.phase2 0A Power being drawn on AC phase 2
xi3.v.c.current.phase3 0A Power being drawn on AC phase 3
xi3.v.c.dc.chargevoltage 0V Voltage seen on the DC charger input
xi3.v.c.dc.contactorstatus open DC contactor state (closed implies we are DC charging)
xi3.v.c.dc.controlsignals 0 DC charger control signals (always see 0?)
xi3.v.c.dc.inprogress no DC charging in progress?
xi3.v.c.dc.plugconnected no Is DC charger plug connected (doesn't seem to work)
xi3.v.c.deratingreasons 0 Reasons why charging rate is derated
xi3.v.c.error 0 Charging error codes
xi3.v.c.failsafetriggers 0 Failsafe trigger reasons
xi3.v.c.interruptionreasons 0 Charging interruption reasons
xi3.v.c.pilotsignal 0A Charge rate pilot signal being received from EVSE
xi3.v.c.readytocharge no Are we ready to charge
xi3.v.c.temp.gatedriver 40°C Charger gatedrive mosfet temperature
xi3.v.c.voltage.dc 8.4V Charger output DC voltage being seen (for AC charging, not DC)
xi3.v.c.voltage.dc.limit 420V Maximum permitted DC voltge
xi3.v.c.voltage.phase1 0V Voltage seen on AC charger input phase 1
xi3.v.c.voltage.phase2 0V Voltage seen on AC charger input phase 2
xi3.v.c.voltage.phase3 0V Voltage seen on AC charger input phase 3
xi3.v.d.chargeport.dc no Is the charger port DC cover open (doesn't seem to work)
xi3.v.e.autorecirc no Ventilation is in "auto-recirculate" mode
xi3.v.e.obdtraffic no Are we seeing OBD-II frames from the car?
xi3.v.p.tripconsumption 127Wh/km Average consumption for the current or most recent trip
xi3.v.p.wheel1_speed 0km/h Wheel 1 speed
xi3.v.p.wheel2_speed 0km/h Wheel 2 speed
xi3.v.p.wheel3_speed 0km/h Wheel 3 speed
xi3.v.p.wheel4_speed 0km/h Wheel 4 speed
xi3.v.p.wheel_speed 0km/h Average wheel speed
======================================== =================== =====================================================================================================
----------------
To be researched
----------------
Can we start/stop charging?
Can we pre-heat?
Can we lock/unlock the car?
Can we disable the OBD-II alarm
Still looking for the trip regen kWh
Can we get the voltage state of each individual cells rather than just the battery min / max / average?

View File

@ -1,8 +0,0 @@
These ecu definition files are generated from the JSON files found in the dev directory.
You will find the relevant programs in the tools directory.
The origin on the JSON ecu definitions in the dev directory is explained in the README file
that you will find there.

View File

@ -1,10 +0,0 @@
// VIN:
#define I3_PID_BDC_VIN 0xF190
// Returns the VIN - 17 byte string response
// POLL line
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_VIN, { 0,300,300,300 }, 0, ISOTP_EXTADR }, // 0xF190

View File

@ -1,244 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/bdc.json: BDC 40: Body domain controller
// This generated code makes it easier to process CANBUS messages from the BDC ecu in a BMW i3
//
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_PIA_NR_AKTUELL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x0F27
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HOD_KALIBRIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA093
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BATTERIEVORSCHAEDIGUNGSHISTORIE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA099
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_WISCHER_LIN_EINLERNVORGANG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA118
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSENSPIEGEL_SELBSTTEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA322
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_REGENSENSOR_INITIALISIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA3B7
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LEUCHTEN_KALTUEBERWACHUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA530
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LEUCHTEN_WARMUEBERWACHUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA531
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HOEHENSTAENDE_OFFSET_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA532
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_GURTZUBRINGER_INIT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA71A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LIN_AUTOADRESSIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA838
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ELV_ANLIEFERZUSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAA73
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SMO_SIMULATION_BEDIENUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAA80
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STEUERN_CA_BROADCAST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAC54
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STEUERN_CA_ANTENNEN_TEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAC55
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STEUERN_FBD_EMPFAENGER_INIT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAC58
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FBD_REICHWEITENMESSUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAC5D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FBD_FEHLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAC5E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ELSV_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD070
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKRADHEIZUNG_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD073
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ELSV_STATEMACHINE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD07B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ELSV_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD07F
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKRAD_MFL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD081
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ELSV_POS_STATUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD089
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SMO_SPIELSCHUTZZAEHLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD096
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SMO_VARIANTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD098
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_PLOCK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD09D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZUSATZINFO_LICHT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0F1
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HANDBREMSE_KONTAKT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD130
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_HINTEN_TASTER_LINKS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD161
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_HINTEN_TASTER_RECHTS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD162
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FA_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD188
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BF_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD189
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FAH_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD18A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BFH_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD18B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_KISI_LED, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD18D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FA_BEWEGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1A7
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BF_BEWEGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1A8
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FAH_BEWEGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1A9
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BFH_BEWEGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1AA
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BFH_RELAIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1AD
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BFH_HALLSENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1AE
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FAH_RELAIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1AF
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FAH_HALLSENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B0
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FA_RELAIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B1
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FA_HALLSENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B2
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BF_RELAIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B3
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BF_HALLSENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B4
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FA_STATUS_DETAIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B5
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BF_STATUS_DETAIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B6
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_FAH_STATUS_DETAIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B7
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FH_BFH_STATUS_DETAIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B8
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_SITZEXT_TASTEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1CA
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_SITZEXT_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1CB
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_TANK_FUELLSTAND_LINKS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD258
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_TANK_FUELLSTAND_RECHTS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD259
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HUPE_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD297
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSENSPIEGEL_THERMOSCHUTZ, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD321
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSENSPIEGEL_LIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD329
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSENSPIEGEL_MEM_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD32B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSENSPIEGEL_HEIZUNG_VERBAUT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD32E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_EC_SPIEGEL_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD330
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSENSPIEGEL_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD331
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSENSPIEGEL_KLAPPEN_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD332
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_UGDO_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD33A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSENSPIEGEL_ABBLENDEN_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD33C
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_UGDO_LAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD33D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_UGDO_MODE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD33E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KOMPASS_SPIEGEL_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD343
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KOMPASS_SPIEGEL_MAGNET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD344
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KOMPASS_SPIEGEL_SPRACHE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD345
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KOMPASS_SPIEGEL_LENKUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD346
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_WISCHER_FRONT_MOTOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD351
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_WISCHER_HECK_MOTOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD353
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SRA_RELAIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD354
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_WASCHWASSERSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD357
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_WISCHER_HECK_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD358
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SRA_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD359
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKSTOCK_WISCHER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD35B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_WISCHER_FRONT_LIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD35E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_REGENSENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD373
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_REGENSENSOR_INIT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD375
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_REGENSENSOR_INT_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD376
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FAHRLICHTSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD3BE
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FAHRLICHTSENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD3BF
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HOD_LENKRAD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD3F0
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HOD_ZUSTAND_GAP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD3F1
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_WISCHER_LIN_DATEN_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD505
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_WISCHER_HECK_MOTOR_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD507
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_INNENLICHTEINHEIT_DRITTE_SITZREIHE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD52C
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LESELICHT_VORNE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD53A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LICHTSCHALTER_WBL_TASTER_BEL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD53D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_RUECKWAERTSGANG_SCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD540
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SCHEINWERFER_GRUNDSTELLUNG_STATUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD541
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LESELICHT_VORNE_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD544
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LESELICHT_HINTEN_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD545
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LWR_DYNAMISCH_SCHRITTE_REFLAUF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD548
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_INNENLICHT_HINTEN_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD54B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_INNENLICHT_VORNE_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD54C
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BUS_IN_BELADUNGSSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD54D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LESELICHT_HINTEN_RECHTS_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD54E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LWR_MANUELL_POTI, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD54F
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LICHTSCHALTEREINHEIT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD550
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LICHTSCHALTER_WBL_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD552
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LESELICHT_HINTEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD553
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_PIA_FLA_FOLLOW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD555
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SCHALTERBELEUCHTUNG_RAENDELRAD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD557
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_PIA_ABBIEGELICHT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD559
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_PIA_TIPPBLINKEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD55E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LWR_MANUELL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD55F
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_PIA_TAGFAHRLICHT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD573
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_INNENLICHT_HINTEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD57B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LWR_MODUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD57E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_INNENLICHT_KLEMME_VA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD57F
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKSTOCK_BLINKER_TASTER_FLA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD580
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKSTOCK_BLINKER_TASTER_BC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD581
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKSTOCK_BLINKER_FRA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD582
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKSTOCK_BLINKER_LICHTHUPE_FERNLICHT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD583
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKSTOCK_BLINKER_WIPPE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD585
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LESELICHT_HINTEN_LINKS_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD587
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LESELICHT_VORNE_RECHTS_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD588
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LESELICHT_VORNE_LINKS_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD589
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LWR_POSITION_MIN_MAX, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD58A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LICHTSCHALTER_NSW_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD58B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LICHTSCHALTER_NSL_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD58C
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AMBIENTE_BELEUCHTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5D3
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_INNENLICHT_MAPPING, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5DE
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AHL_LWR_TMS_ID_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5E5
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HOEHENSTAENDE_SENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD601
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HOEHENSTAENDE_VERSORGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD603
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HOEHENSTAENDE_KALIBRIERUNG_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD604
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_FES_MODUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD611
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_FES_STATISTIK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD612
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SWITCH_BOARD_TASTEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD622
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_FES_DATEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD625
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SWITCHBOARD_TASTE_VERBAU, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD627
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUSSTATTUNG_CORONA_LED, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD62B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FES_MASTER_SW_FEHLER_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD62D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SWITCH_BOARD_TASTEN_VERBAU, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD669
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KUEHLMITTELSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD672
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_GURTZUBRINGER_FA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD71A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_GURTZUBRINGER_BF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD71B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_FA_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD726
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_BF_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD727
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_FAH_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD728
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_BFH_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD729
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BUS_IN_SITZHEIZUNG_STUFE_BF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD72D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_BF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD730
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BUS_IN_SITZHEIZUNG_STUFE_FA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD731
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_VORHANDEN_DRITTE_SITZREIHE_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD762
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_VERRIEGELUNG_ZWEITE_SITZREIHE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD763
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_FA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD771
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_FAH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD7EA
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_BFH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD7EC
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SITZHEIZUNG_HINTEN_TASTER_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD86C
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_VORHANDEN_FONDSCHICHTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8AA
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SOLARSENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8AB
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUC_SENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8AC
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FENSTERHEBER_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8FE
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KLIMAKOMPRESSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD906
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_VORHANDEN_KOMPRESSORKUPPLUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD916
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_DRUCKSENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD959
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_VORHANDEN_WASSERVENTIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD95A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SOLARSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD961
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_AUC_SENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD963
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_DRUCKSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD967
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BESCHLAGSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD96C
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BESCHLAGSENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD96D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_FONDSCHICHTUNGS_POTI, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD96E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_DRUCKSENSOR_HOCHAUFLOESEND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9B8
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LENKRAD_SCHALTPADDLES, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA24
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_DC_DC_WANDLER_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA54
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STAT_LIN_LAYERING, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA5F
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_CODIERUNG_FAHRZEUGKLAPPEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA61
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_TUERKONTAKT_BFH_OBEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA7B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_TUERKONTAKT_FAH_OBEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA7E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZV_BEIFAHRER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA81
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZV_BEIFAHRER_HINTEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA82
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZV_FAHRER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA83
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZV_FAHRER_HINTEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA84
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZV_HECKKLAPPE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA85
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZV_HECKSCHEIBE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA86
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZV_GESAMT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA87
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ZV_KURZSCHLUSSABSCHALTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA95
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SPANNUNG_KLEMMEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAB3
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KEY_VALID_NR_AKTUELL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAB4
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_CA_TAGE_ER_LEITUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAB5
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_START_STOP_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAB6
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_KLEMMEN_VERHINDERER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDABA
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BUS_IN_DATUM_ZEIT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDABB
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BUS_IN_DME1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDABC
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BUS_IN_DSC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDABD
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BUS_IN_FH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDABF
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_CA_TAGE_STATUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDACA
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SPANNUNG_KLEMME_30L1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAD6
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_SPANNUNG_KLEMME_30L2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAD7
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KLEMMENSTEUERUNG_KURZSCHLUSSABSCHALTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB12
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HECKKLAPPENSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB16
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_NACHLAUFZEIT_KLEMME_15N, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB2D
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_NACHLAUFZEIT_KLEMME_30B, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB2E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_KLEMMEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC56
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_STATUS_KL15_ABSCHALTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC57
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_ANSTEUERUNG_KL30F_HINTEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC5A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_BREMSLICHT_SCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC61
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_KUPPL_PN_SCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC63
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_MOTORHAUBE_SCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC65
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HOTEL_SCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC66
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_READHWMODIFICATIONINDEX, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF152
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_LWR_STATISTIK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x2302
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_COUNT_NSC_MIRRORHEATING_ACTIVATIONS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x2303
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__LWR_DIAG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4507
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__LICHT_UEBERSPANNUNGSCOUNTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4508
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__ZV_KURZSCHLUSSABSCHALTUNG_ZAEHLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4700
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__INNENBELEUCHTUNG_DAUERAUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4801
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__SARAH_STATISTIK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4910
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__STATUS_BASESTATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4E07
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_IBS_WAKEUP_GRUND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4F0E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__STATUS_DFZ_SK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5001
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__STATUS_DFZ_GUELTIGKEIT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5003
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__KLEMMENSTEUERUNG_KURZSCHLUSSABSCHALTUNG_ZAEHLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5020
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__ECUMA_INTERN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5101
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__ECUMA_SLEEP_MODE_NRC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5109
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_HW_INFO_PROVIDER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x510A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__JTAGLOCK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x510B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_READ_PULLUP_REF_RESFUEL_TANK_0, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5DBE
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC_READ_PULLUP_REF_RESFUEL_TANK_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5DBF
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_FA_STATISTIKZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6020
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_BF_STATISTIKZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6021
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_FAH_STATISTIKZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6022
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_BFH_STATISTIKZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6023
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_DENORMIERUNGS_LOGGER_LESEN_FRONT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x603A
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_DENORMIERUNGS_LOGGER_LESEN_REAR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x603B
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_REVERSIER_LOGGER_LESEN_FRONT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x603E
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_REVERSIER_LOGGER_LESEN_REAR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x603F
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_MOTORSTOP_LOGGER_LESEN_FRONT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6042
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__FH_MOTORSTOP_LOGGER_LESEN_REAR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6043
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__STEUERN_DFZ_VERBINDUNGSENDE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF003
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__ECU_HW_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF005
//{ I3_ECU_BDC_TX, I3_ECU_BDC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_BDC__LWR_STATISTIK_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF105

View File

@ -1,92 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/dsc_i1.json: DSC 29: Dynamic stability controller
// This generated code makes it easier to process CANBUS messages from the DSC ecu in a BMW i3
//
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FS_LOESCHEN_PERMANENT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1060
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FEHLERSPEICHER_ENDE_WERKSABLAUF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1061
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_START_ADAPTIVDATEN_RUECKSETZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA051
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STEUERN_AX_AY_ABGLEICH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA052
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_START_ADAPTIVDATEN_WERKSMODUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA053
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STEUERN_ADAPTIVDATEN_SLW_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA05B
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RPA_RESET_STATISTIK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA068
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_DSC_DRUCKSENSOREN_KALIBRIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA070
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RPA_RESET_STANDARDISIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA074
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_DAC_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA087
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_DAC_AUSLOESUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA088
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_IPB_LED, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA123
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FLM_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA130
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EXTERNE_ANFORDERUNG_GKU_IPB_ZAEHLER_RUECKSETZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA1AA
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EXTERNE_ANFORDERUNG_EPB_ZAEHLER_RUECKSETZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA1BE
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_DSC_PUMPENFUNKTIONSTEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA222
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STEUERN_ANTI_POWER_HOP_FUNKTION_ZAEHLER_RUECKSETZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA2A2
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STEUERN_EEPROM_SCHREIBEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAB5B
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_START_ADAPTIVDATEN_WERKSMODUS_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xABA3
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_GMK_DATEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD09A
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_BREMSPEDALWINKELSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0D2
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_CBS_BREMSE_DETAILS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD272
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FES_COORDINT_SW_FEHLER_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD62E
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FLM_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6D6
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EMF_LERNDATEN_STATISTIK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD804
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EMF_AKTUATOR_KOMBISATTEL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD805
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EMF_LERNDATEN_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD808
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EMF_LERNDATEN_AKTUATOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD80A
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EMF_KLEMMEN_KOMBISATTEL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD80C
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EMF_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD80D
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EXTERNE_ANFORDERUNG_GKU_IPB_ZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD81A
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_LESEN_ANTI_POWER_HOP_FUNKTION_ZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8EB
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_MODUS_ROLLENPRUEFSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB5B
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_GIERRATE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBD9
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_QUERBESCHLEUNIGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBDA
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_LAENGSBESCHLEUNIGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBDB
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_BREMSBELAGSSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBDF
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_REIFENPANNENANZEIGE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBE3
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_GESCHWINDIGKEIT_RAD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBE4
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_DSC_DRUCKSENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBE5
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_DSC_KLEMMEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBE7
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_VAKUUMSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBF4
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_BREMSPEDALWEGSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBF5
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_BREMSREKUPERATIONSMOMENT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDBF6
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_ADAPTIVDATEN_ZUSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC13
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RPA_LERNDATEN_STATISTIK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC14
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RPA_LERNDATEN_STD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC15
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_DSC_BREMSLICHTSCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC1E
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_BREMSFLUESSIGKEITSSCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC1F
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_GBRPLUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC3A
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_LLP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC42
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_ABS_FUNKTION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC6C
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_ASC_FUNKTION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC6D
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FDR_FUNKTION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC6E
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_PBRK_FUNKTION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC6F
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_HDC_FUNKTION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC70
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_MIRROR_AAEPS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC8F
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_MIRROR_EV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC90
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_MIRROR_SBS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC91
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_MIRROR_TSC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC92
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_MIRROR_ZFM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC93
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_RDC_VERSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC94
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_RDC_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC95
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_INAKTIVEREIGNIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC96
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_KALIBRIEREREIGNIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC97
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_MESSDATENBLOCK_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC98
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_MESSDATENBLOCK_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC99
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_MESSDATENBLOCK_3, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC9A
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_MESSDATENBLOCK_4, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC9B
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_WARNEREIGNIS_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC9C
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_WARNEREIGNIS_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC9D
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_WARNEREIGNIS_3, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC9E
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_WARNEREIGNIS_RUECKNAHME, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC9F
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_RE_LESEN_DRUCKCODIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCD9
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_WARNEREIGNIS_WEICH_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCF1
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_WARNEREIGNIS_WEICH_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCF2
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_RDC_HS_WARNEREIGNIS_WEICH_3, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCF3
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_STATUS_AUTO_EPB_ZAEHLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD1B
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_EXTERNE_ANFORDERUNG_EPB_ZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE354
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC__SW_IDENTIFIKATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4000
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FAHRZEUGZUSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5002
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_ANTRIEBSZUSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5004
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_SPANNUNGSMASTER_VERFUEGBAR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5008
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FUNKTIONSZUSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x500B
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_INTERNER_FUNKTIONSZUSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x500C
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_FEHLERSPEICHERSPERRE_AKTIV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x500F
//{ I3_ECU_DSC_TX, I3_ECU_DSC_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_DSC_NETZWERK_ROHDATEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x5010

View File

@ -1,24 +0,0 @@
// -------- IBS (12V Battery monitor) --------------------------------------------------------------------------------------
#define I3_PID_EDM_STATUS_MESSWERTE_IBS 0x402B
// Values from the IBS - the battery monitor
#define I3_RES_EDM_STAT_T_BATT_WERT (RXBUF_SINT(0)/10)
#define I3_RES_EDM_STAT_T_BATT_WERT_UNIT '°C'
#define I3_RES_EDM_STAT_T_BATT_WERT_TYPE float
// Temp
#define I3_RES_EDM_STAT_U_BATT_WERT (RXBUF_UINT(2)/4000.0f+6.0f)
#define I3_RES_EDM_STAT_U_BATT_WERT_UNIT 'V'
#define I3_RES_EDM_STAT_U_BATT_WERT_TYPE float
// Battery voltage
#define I3_RES_EDM_STAT_I_BATT_WERT (RXBUF_UINT(4)/12.5f-200.0f)
#define I3_RES_EDM_STAT_I_BATT_WERT_UNIT 'A'
#define I3_RES_EDM_STAT_I_BATT_WERT_TYPE float
// Battery current
// POLL line
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_MESSWERTE_IBS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x402B

View File

@ -1,45 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/edmei1.json: EDM 12: Electrical digital motor electronics (low voltage ECU)
// This generated code makes it easier to process CANBUS messages from the EDM ecu in a BMW i3
//
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_ENTLUEFTUNG_KUEHLSYSTEM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA1D0
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_MCAMOS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xADFA
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_12V_NACHLADEHISTORIE_LOESCHEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAE02
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_12V_NACHLADEHISTOGRAMM_LOESCHEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAE03
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_EME_KAELTEMITTEL_ABSPERRVENTIL_ON_OFF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE22
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_PEDALWERTGEBER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE9C
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_REX_STATISTIK_BETRIEB, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEE1
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_REX_STATISTIK_DREHZAHL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEE2
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_ZYKLISCHES_NACHLADEN_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEFD
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_ZYKLISCHES_NACHLADEN_HISTOGRAMM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEFE
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_REX_STATISTIK_TEMPERATUR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF53
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_REX_STATISTIK_KILOMETER_KLASSEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF54
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_REX_STATISTIK_ZYKLEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF55
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_REX_STATISTIK_SOC_KILOMETER_KLASSEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF56
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_REX_STATISTIK_ZAEHLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF5E
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STEUERN_INTERLOCK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1061
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_12V_NACHLADEHISTORIE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x409D
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_12V_NACHLADEHISTOGRAMM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x409E
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_E_S_KL_15_WUP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4101
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_E_A_PWG1_RAW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4102
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_E_A_PWG2_RAW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4103
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_E_A_TMEL_RAW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4104
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_BATTERIE_VOLTAGE_RAUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4105
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_A_U_PWG1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4106
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_A_U_PWG2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4107
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_E_A_MEL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4109
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_ECU_MICRO_TEMPERATUR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x410A
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_E_A_TMEL2_RAW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x410B
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_A_S_ELRLY, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4120
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_A_T_ELUE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4121
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_A_T_EWP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4122
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_A_S_KV1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4123
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_A_S_KV2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4124
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_A_S_MEL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4125
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_E_A_PWG1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4182
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_E_A_PWG2_FILTERED, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4183
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_TEMPERATUR_SENSOR_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4184
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_BATTERY_VOLTAGE_FILTERED, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4185
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STATUS_TEMPERATUR_SENSOR_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x418B
//{ I3_ECU_EDM_TX, I3_ECU_EDM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EDM_STEUERN_AKKS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF0D5

View File

@ -1,76 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/eme_i01.json: EME 1A: Electrical machine electronics
// This generated code makes it easier to process CANBUS messages from the EME ecu in a BMW i3
//
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_FS_LOESCHEN_PERMANENT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1060
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_FEHLERSPEICHER_ENDE_WERKSABLAUF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1061
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AKS_DIAG_STATUS_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4009
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EME_DCDC_LV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDF6
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EME_HVPM_DCDC_ANSTEUERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE00
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EME_HVPM_HV_SYSTEM_ON_OFF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE02
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EME_HVPM_ENERGIEBORDNETZ_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE04
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EME_HVPM_PKOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE06
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EME_HVIL_GESAMT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE0C
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EME_ANSTEUERUNG_ELUP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE0E
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EME_HVPM_DCDC_ALS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE1C
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_CPLD_VERSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE2D
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_SYSTEMLEISTUNG_INV_EM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE39
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_LSC_LADEN_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE6E
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_CHARGE_ENABLE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE71
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_PARKSPERRE_SENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE74
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_HV_SPANNUNG_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE75
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_PARKSPERRE_SW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE76
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_PARKSPERRE_POSITION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE79
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_PARKSPERRE_STROM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE7B
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_PARKSPERRE_SPANNUNGEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE7C
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ROHSIG_AUSGANG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE7D
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ROHSIG_EINGANG_SENS_ELUP_BUDS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE7E
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ROHSIG_EINGANG_SENS_EM_INV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE7F
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ROHSIG_EINGANG_SENS_PARKSPERRE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE80
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ROHSIG_EINGANG_SENS_SG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE81
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ROHSIG_EINGANG_SENS_SLE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE82
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ROHSIG_EINGANG_SENS_DCDC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE83
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_BETRIEBSZUSTAND_SLE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE84
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_SLE_LEISTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE85
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_SLE_SPANNUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE86
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_SLE_STROM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE87
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_SPANNUNG_KLEMME30B, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE88
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_STROM_DCDC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE89
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_STROM_EMASCHINE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE8A
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_TEMP_LE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE8C
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ZUSTAND_1_DCDC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE92
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ZUSTAND_DCDC_FEHLERBILD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE96
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_STATUS_CONNECTED_DRIVE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE9E
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_BUDS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEA5
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_TEMP_EMASCHINE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEA6
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ELEKTRISCHE_MASCHINE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEA7
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_ZUSTAND_2_DCDC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEA9
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_PARKSPERRE_VERSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEB0
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_CTRL_VERSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEBC
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_SPANNUNG_DCDC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEBD
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_SPANNUNG_LE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEBE
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_SYSSTATE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEBF
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_SPANNUNG_ELUP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEC2
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_STROM_ELUP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEC3
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_FAHRSTUFE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEDD
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_LSC_LADEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEDE
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_HISTOGRAMM_ANTRIEB, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEED
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_HISTOGRAMM_DEGRADATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEEF
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AUTOP_SBW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEFB
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_FAHRSTUFEN_ZAEHLER_SBW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEFF
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_HISTOGRAMM_LADEKOORDINATOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF49
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_INVERTER_HISTOGRAMM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF4D
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_INVERTER_RBM_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF58
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_DCDC_RBM_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF59
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_LADEGERAET_RBM_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF5A
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_LIEFERANT_TRACE_NUMMER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF5B
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_LADEGERAET_TEMPERATUR_HISTOGRAMM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB5
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_LADEGERAET_HV_UEBERSTROM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB7
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_EMASCHINE_MAX_DREHZAHL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFCE
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_LAST_HISTOGRAMM_EMASCHINE_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFD0
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_RATE_BASED_MONITORING, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE52F
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_LADEKOORDINATOR_INTERFACE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE5FE
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_DCDC_MESSGROESSEN_KOMPLETT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE5FF
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_RESETINFO_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF011
//{ I3_ECU_EME_TX, I3_ECU_EME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EME_AE_FREILAUF_MODUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF050

View File

@ -1,166 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/eps_i1.json: EPS 30: Power steering
// This generated code makes it easier to process CANBUS messages from the EPS ecu in a BMW i3
//
case I3_PID_EPS_STEUERN_EPS_PULLDRIFT_OFFSET_RESET: { // 0xA2BB
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_EPS_LENKWINKELSENSOR_KALIBRIERUNG_RESET: { // 0xAB69
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_EPS_INITIALISIERUNG_SERVICE: { // 0xAB6C
if (datalen < 4) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_EPS_EPS_INITIALISIERUNG_SERVICE", 4);
break;
}
unsigned char STAT_ROUTINE_STATUS = (RXBUF_UCHAR(0));
// Execution status / Ausführungsstatus
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "EPS", "EPS_INITIALISIERUNG_SERVICE", "STAT_ROUTINE_STATUS", STAT_ROUTINE_STATUS, "\"0-n\"");
short STAT_LENKRADWINKEL_WERT = (RXBUF_SINT(1));
// Steering wheel angle / Lenkradwinkel
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%d%s\n", "EPS", "EPS_INITIALISIERUNG_SERVICE", "STAT_LENKRADWINKEL_WERT", STAT_LENKRADWINKEL_WERT, "\"°\"");
char STAT_SENSOR_ZUSTAND_NR = (RXBUF_SCHAR(3));
// Condition sensor pinion angle sensor / Zustand Sensor Ritzelwinkelsensor
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "EPS", "EPS_INITIALISIERUNG_SERVICE", "STAT_SENSOR_ZUSTAND_NR", STAT_SENSOR_ZUSTAND_NR, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_STEUERN_EPS_MULTITURNWERT_RESET: { // 0xAB7D
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_EPS_RITZELWINKELSENSOR: { // 0xDB57
if (datalen < 7) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_EPS_EPS_RITZELWINKELSENSOR", 7);
break;
}
float STAT_RITZELWINKEL_WERT = (RXBUF_SINT32(0)/100.0f);
// Pinion angle / Ritzelwinkel
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "EPS", "EPS_RITZELWINKELSENSOR", "STAT_RITZELWINKEL_WERT", STAT_RITZELWINKEL_WERT, "\"°\"");
short STAT_RITZELWINKELGESCHWINDIGKEIT_WERT = (RXBUF_SINT(4));
// Pinion angle angular speed / Ritzelwinkel Winkelgeschwindigkeit
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%d%s\n", "EPS", "EPS_RITZELWINKELSENSOR", "STAT_RITZELWINKELGESCHWINDIGKEIT_WERT", STAT_RITZELWINKELGESCHWINDIGKEIT_WERT, "\"°/s\"");
char STAT_SENSOR_ZUSTAND_NR_0XDB57 = (RXBUF_SCHAR(6));
// Condition sensor pinion angle sensor / Zustand Sensor Ritzelwinkelsensor
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "EPS", "EPS_RITZELWINKELSENSOR", "STAT_SENSOR_ZUSTAND_NR_0XDB57", STAT_SENSOR_ZUSTAND_NR_0XDB57, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_EPS_MOMENTENSENSOR: { // 0xDB99
if (datalen < 3) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_EPS_EPS_MOMENTENSENSOR", 3);
break;
}
float STAT_MOMENT_WERT = (RXBUF_SINT(0)/128.0f);
// Current moment / Aktuelles Moment
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "EPS", "EPS_MOMENTENSENSOR", "STAT_MOMENT_WERT", STAT_MOMENT_WERT, "\"Nm\"");
char STAT_SENSOR_ZUSTAND_NR_0XDB99 = (RXBUF_SCHAR(2));
// State of the steering torque sensor / Zustand Sensor Lenkmoment
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "EPS", "EPS_MOMENTENSENSOR", "STAT_SENSOR_ZUSTAND_NR_0XDB99", STAT_SENSOR_ZUSTAND_NR_0XDB99, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_EPS_ZAHNSTANGENMITTE: { // 0xDC77
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_EPS_EPS_ZAHNSTANGENMITTE", 1);
break;
}
unsigned char STAT_ZAHNSTANGENMITTE_ZUSTAND_NR = (RXBUF_UCHAR(0));
// State of rack center learned / Zustand Zahnstangenmitte gelernt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "EPS", "EPS_ZAHNSTANGENMITTE", "STAT_ZAHNSTANGENMITTE_ZUSTAND_NR", STAT_ZAHNSTANGENMITTE_ZUSTAND_NR, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_GELERNTER_ZAHNSTANGENWEG: { // 0xDFDD
if (datalen < 0) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_EPS_GELERNTER_ZAHNSTANGENWEG", 0);
break;
}
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_READHWMODIFICATIONINDEX: { // 0xF152
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_EPS_READHWMODIFICATIONINDEX", 2);
break;
}
unsigned char STAT_HW_MODIFICATION_INDEX_WERT = (RXBUF_UCHAR(0));
// Index of hardware modification: FF: Not supported index / Index of hardware modification: FF: Not supported
// index
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "EPS", "READHWMODIFICATIONINDEX", "STAT_HW_MODIFICATION_INDEX_WERT", STAT_HW_MODIFICATION_INDEX_WERT, "\"HEX\"");
unsigned char BF_22_F152_SUPPLIERINFO = (RXBUF_UCHAR(1));
// Supplier info tab / Tab Supplierinfo
// BF_22_F152_SUPPLIERINFO is a BITFIELD of size unsigned char. We don't yet generate definitions for each bit, we treat as the host data type
// STAT_HWMODEL: Mask: 0xC0 - hardware model
// STAT_SUPPLIERINFOFIELD: Mask: 0x3F - supplierInfo
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "EPS", "READHWMODIFICATIONINDEX", "BF_22_F152_SUPPLIERINFO", (unsigned long)BF_22_F152_SUPPLIERINFO, "\"Bit\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_EPS_FLASH_UPDATE_MULTITURNZAEHLER: { // 0x1234
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_EPS_FLASH_UPDATE_MULTITURNZAEHLER", 2);
break;
}
unsigned char STAT_SERVICE = (RXBUF_UCHAR(0));
// Status of the service / Status des Service
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "EPS", "FLASH_UPDATE_MULTITURNZAEHLER", "STAT_SERVICE", STAT_SERVICE, "\"0-n\"");
unsigned char STAT_PIC = (RXBUF_UCHAR(1));
// Status of the processor to be flashed / Status des zu flashenden Prozessors
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "EPS", "FLASH_UPDATE_MULTITURNZAEHLER", "STAT_PIC", STAT_PIC, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}

View File

@ -1,125 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/eps_i1.json: EPS 30: Power steering
// This generated code makes it easier to process CANBUS messages from the EPS ecu in a BMW i3
//
#define I3_ECU_EPS_TX 0x06F130
#define I3_ECU_EPS_RX 0x0630F1
#define I3_PID_EPS_STEUERN_EPS_PULLDRIFT_OFFSET_RESET 0xA2BB
// Reset EPS pull-drift long-term offset / Reset EPS Pull-Drift Langzeit-Offset
// Skipping EPS_PENDELN on 0xAB56 which takes arguments
#define I3_PID_EPS_EPS_LENKWINKELSENSOR_KALIBRIERUNG_RESET 0xAB69
// Start reset steering angle offset / Start Reset Lenkwinkel Offset
#define I3_PID_EPS_EPS_INITIALISIERUNG_SERVICE 0xAB6C
// Start, stop and status initialization routine / Starten, Stoppen und Status Initialisierungsroutine
#define I3_RES_EPS_STAT_ROUTINE_STATUS (RXBUF_UCHAR(0))
#define I3_RES_EPS_STAT_ROUTINE_STATUS_UNIT '0-n'
#define I3_RES_EPS_STAT_ROUTINE_STATUS_TYPE unsigned char
// Execution status / Ausführungsstatus
#define I3_RES_EPS_STAT_LENKRADWINKEL_WERT (RXBUF_SINT(1))
#define I3_RES_EPS_STAT_LENKRADWINKEL_WERT_UNIT '°'
#define I3_RES_EPS_STAT_LENKRADWINKEL_WERT_TYPE short
// Steering wheel angle / Lenkradwinkel
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR (RXBUF_SCHAR(3))
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR_UNIT '0-n'
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR_TYPE char
// Condition sensor pinion angle sensor / Zustand Sensor Ritzelwinkelsensor
// Skipping EPS_VERFAHREN on 0xAB71 which takes arguments
// Skipping EPS_INITIALISIERUNG_WERK on 0xAB72 which takes arguments
#define I3_PID_EPS_STEUERN_EPS_MULTITURNWERT_RESET 0xAB7D
// Reset EPS multiturn value / Reset EPS Multiturnwert
#define I3_PID_EPS_EPS_RITZELWINKELSENSOR 0xDB57
// Read out data EPS pinion angle / Auslesen Daten EPS Ritzelwinkel
#define I3_RES_EPS_STAT_RITZELWINKEL_WERT (RXBUF_SINT32(0)/100.0f)
#define I3_RES_EPS_STAT_RITZELWINKEL_WERT_UNIT '°'
#define I3_RES_EPS_STAT_RITZELWINKEL_WERT_TYPE float
// Pinion angle / Ritzelwinkel
#define I3_RES_EPS_STAT_RITZELWINKELGESCHWINDIGKEIT_WERT (RXBUF_SINT(4))
#define I3_RES_EPS_STAT_RITZELWINKELGESCHWINDIGKEIT_WERT_UNIT '°/s'
#define I3_RES_EPS_STAT_RITZELWINKELGESCHWINDIGKEIT_WERT_TYPE short
// Pinion angle angular speed / Ritzelwinkel Winkelgeschwindigkeit
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR_0XDB57 (RXBUF_SCHAR(6))
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR_0XDB57_UNIT '0-n'
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR_0XDB57_TYPE char
// Condition sensor pinion angle sensor / Zustand Sensor Ritzelwinkelsensor
// Skipping EPS_LENKWINKELSENSOR_KALIBRIERUNG on 0xDB5A which takes arguments
#define I3_PID_EPS_EPS_MOMENTENSENSOR 0xDB99
// Reading out data from the steering torque sensor / Auslesen Daten Sensor Lenkmoment
#define I3_RES_EPS_STAT_MOMENT_WERT (RXBUF_SINT(0)/128.0f)
#define I3_RES_EPS_STAT_MOMENT_WERT_UNIT 'Nm'
#define I3_RES_EPS_STAT_MOMENT_WERT_TYPE float
// Current moment / Aktuelles Moment
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR_0XDB99 (RXBUF_SCHAR(2))
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR_0XDB99_UNIT '0-n'
#define I3_RES_EPS_STAT_SENSOR_ZUSTAND_NR_0XDB99_TYPE char
// State of the steering torque sensor / Zustand Sensor Lenkmoment
#define I3_PID_EPS_EPS_ZAHNSTANGENMITTE 0xDC77
// State of rack center learned / Zustand Zahnstangenmitte gelernt
#define I3_RES_EPS_STAT_ZAHNSTANGENMITTE_ZUSTAND_NR (RXBUF_UCHAR(0))
#define I3_RES_EPS_STAT_ZAHNSTANGENMITTE_ZUSTAND_NR_UNIT '0-n'
#define I3_RES_EPS_STAT_ZAHNSTANGENMITTE_ZUSTAND_NR_TYPE unsigned char
// State of rack center learned / Zustand Zahnstangenmitte gelernt
#define I3_PID_EPS_GELERNTER_ZAHNSTANGENWEG 0xDFDD
// GELERNTER_ZAHNSTANGENWEG / GELERNTER_ZAHNSTANGENWEG
// Can't process STAT_LENKRADWINKEL_LIEFERANT_WERT - don't know type motorola float (*** this will mean all the following offsets are wrong!!! ****)
// Can't process STAT_LENKRADWINKEL_AUTOMATISCH_GELERNT_WERT - don't know type motorola float (*** this will mean all the following offsets are wrong!!! ****)
#define I3_PID_EPS_READHWMODIFICATIONINDEX 0xF152
// This service is only used if there has been a slight hardware change on the control unit that did not result
// in a change in the part number or the hardware SGBM IDs. Such a change cannot be diagnosed from the outside,
// which is why this service was introduced for it. / Dieser Service kommt nur zum Einsatz, wenn es eine
// geringfügige Hardwareänderung an dem Steuergerät gegeben hat, die nicht zu einer Änderung der Sachnummer bzw.
// der Hardware SGBM-IDs geführt hat. Eine solche Änderung ist von außen nicht diagnostizierbar, daher wurde
// dieser Dienst dafür eingeführt.
#define I3_RES_EPS_STAT_HW_MODIFICATION_INDEX_WERT (RXBUF_UCHAR(0))
#define I3_RES_EPS_STAT_HW_MODIFICATION_INDEX_WERT_UNIT 'HEX'
#define I3_RES_EPS_STAT_HW_MODIFICATION_INDEX_WERT_TYPE unsigned char
// Index of hardware modification: FF: Not supported index / Index of hardware modification: FF: Not supported
// index
// BF_22_F152_SUPPLIERINFO is a BITFIELD of size unsigned char. We don't yet generate definitions for each bit, we treat as the host data type
// Supplier info tab / Tab Supplierinfo
// STAT_HWMODEL: Mask: 0xC0 - hardware model
// STAT_SUPPLIERINFOFIELD: Mask: 0x3F - supplierInfo
#define I3_RES_EPS_BF_22_F152_SUPPLIERINFO (RXBUF_UCHAR(1))
#define I3_RES_EPS_BF_22_F152_SUPPLIERINFO_UNIT 'Bit'
#define I3_RES_EPS_BF_22_F152_SUPPLIERINFO_TYPE unsigned char
// Supplier info tab / Tab Supplierinfo
#define I3_PID_EPS_FLASH_UPDATE_MULTITURNZAEHLER 0x1234
// Flash update of the multiturn counter / Flash Update des Multiturnzählers
#define I3_RES_EPS_STAT_SERVICE (RXBUF_UCHAR(0))
#define I3_RES_EPS_STAT_SERVICE_UNIT '0-n'
#define I3_RES_EPS_STAT_SERVICE_TYPE unsigned char
// Status of the service / Status des Service
#define I3_RES_EPS_STAT_PIC (RXBUF_UCHAR(1))
#define I3_RES_EPS_STAT_PIC_UNIT '0-n'
#define I3_RES_EPS_STAT_PIC_TYPE unsigned char
// Status of the processor to be flashed / Status des zu flashenden Prozessors

View File

@ -1,15 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/eps_i1.json: EPS 30: Power steering
// This generated code makes it easier to process CANBUS messages from the EPS ecu in a BMW i3
//
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_STEUERN_EPS_PULLDRIFT_OFFSET_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA2BB
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_EPS_LENKWINKELSENSOR_KALIBRIERUNG_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAB69
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_EPS_INITIALISIERUNG_SERVICE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAB6C
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_STEUERN_EPS_MULTITURNWERT_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAB7D
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_EPS_RITZELWINKELSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB57
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_EPS_MOMENTENSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB99
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_EPS_ZAHNSTANGENMITTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDC77
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_GELERNTER_ZAHNSTANGENWEG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFDD
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_READHWMODIFICATIONINDEX, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF152
//{ I3_ECU_EPS_TX, I3_ECU_EPS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_EPS_FLASH_UPDATE_MULTITURNZAEHLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1234

View File

@ -1,35 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/fzd_f15.json: FZD 56: Roof function centre
// This generated code makes it easier to process CANBUS messages from the FZD ecu in a BMW i3
//
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_SINE_ANSTEUERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAA70
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_SINE_BATT_LEVEL_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAA71
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_ALARM_ANZAHL_LOESCHEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAA7A
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_HALLSENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD180
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_ESH_TASTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD192
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_ESH_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD193
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_ESH_TASTER_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD194
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD195
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_BEWEGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD196
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_STATUS_DETAIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1A6
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_RELAIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1B9
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_ESH_BEWEGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1BA
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_ESH_HALLSENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1BB
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_ESH_RELAIS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1BC
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_ESH_STATUS_DETAIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1BD
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_STATISTIKZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1BE
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_ESH_STATISTIKZAEHLER_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1C0
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_SINE_LIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCA1
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_SINE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCA2
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_SINE_BATT_LEVEL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCA3
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_SINE_NEIGUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCA9
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_INTERN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCAC
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_ALARM_AUSGELOEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCB0
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCB1
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_USIS_EMPFINDLICHKEIT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCB2
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_KLAPPENKONTAKTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDCDD
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_ESH_BEWERTUNG_KENNLINIE_SCHIEBELAGE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4107
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_BEWERTUNG_KENNLINIE_AUSSTELLLAGE_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4108
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_SHD_BEWERTUNG_KENNLINIE_SCHIEBELAGE_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4109
//{ I3_ECU_FZD_TX, I3_ECU_FZD_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_FZD_DWA_ALARM_ANZAHL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6012

View File

@ -1,111 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/ihx_i1.json: IHX 78: Integrated automatic heating/aircon
// This generated code makes it easier to process CANBUS messages from the IHX ecu in a BMW i3
//
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_EDH_VERRIEGELUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA11B
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_WP_BEFUELLUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA11C
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_WP_EXP_VENTIL_KALIBRIEREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA11D
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SITZHEIZUNG_VORNE_TASTER_LINKS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD15D
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SITZHEIZUNG_VORNE_TASTER_RECHTS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD15E
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SITZHEIZUNG_VORNE_LED_RECHTS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD15F
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SITZHEIZUNG_VORNE_LED_LINKS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD160
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_FBM_TASTEN_VORHANDEN_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD599
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TEMP_FUSSRAUM_LINKS_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD859
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TEMP_FUSSRAUM_RECHTS_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD85A
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TEMP_INNEN_UNBELUEFTET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD85C
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_POTI_SCHICHTUNG_FOND_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD860
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KONFIGURATION_KLIMA_VORN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD866
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KAELTEMITTEL_MEDIUM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD868
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_STEUERN_MOTOREN_KALIBRIERLAUF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD88D
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SCHRITTMOTOR_FEHLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD88E
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_STEUERN_SELBSTTEST_SCHRITTMOTOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD88F
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VORHANDEN_FONDSCHICHTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8AA
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SOLARSENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8AB
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_AUC_SENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8AC
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_EKK_DREHZAHLERHOEHUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8C2
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_EKMV_ANALOGWERTE_GEN20, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8C4
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_EKMV_BETRIEBSZUSTAND_GEN20, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8C5
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_EDH_STATUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8CD
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KONFIGURATION_KLIMA_PRODUKTLINIE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8CE
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_HV_POWERMANAGEMENT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8D2
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_HV_PM_EDH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8D3
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_KUEHLMITTELTEMPERATUR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD8D4
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SOLLWERT_ELEKTRISCHER_ZUHEIZER_VORN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD902
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_OUT_ZUSATZWASSERPUMPE_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD904
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TIMER_EINLAUFSCHUTZ, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD905
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SITZHEIZUNG_VORNE_TASTER_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD90E
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VORHANDEN_KOMPRESSORKUPPLUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD916
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_LUFTVERTEILUNG_LI_RE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD91A
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_OUT_KLIMAKOMPRESSOR_PWM_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD91D
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_KLAPPEN_PRG_MITTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD928
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_GEBLAESESTUFE_ANZ, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD92B
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_OFF_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD92C
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_DEFROST_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD92D
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_MAX_AC_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD92E
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_AUC_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD930
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_UMLUFT_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD931
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_HHS_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD932
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_AC_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD934
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_KLIMASTIL_MITTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD936
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_STANDLUEFTEN_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD939
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_GEBLAESELEISTUNG_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD93F
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_DEFROST_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD941
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_BELUEFTUNG_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD942
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_FUSSRAUM_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD947
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_SCHICHTUNG_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD949
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_SCHICHTUNG_LI_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD94A
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_SCHICHTUNG_RE_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD94B
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_UMLUFT_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD94D
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_TEMP_LUFT_FOND_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD950
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_MOTOR_KALIBRIERLAUF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD953
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SELBSTTEST_SCHRITTMOTORE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD954
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TEMP_BELUEFTUNG_LINKS_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD957
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TEMP_BELUEFTUNG_RECHTS_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD958
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_DRUCKSENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD959
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VORHANDEN_WASSERVENTIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD95A
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TEMP_VERDAMPFER_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD95C
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_KOMPRESSORFREIGABE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD960
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_SOLARSENSOR_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD962
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_AUC_SENSOR_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD964
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_BESCHLAGSENSOR_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD966
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_KAELTEMITTELDRUCK_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD968
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_IN_TEMP_AUSSEN_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD96B
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BESCHLAGSENSOR_VORHANDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD96D
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_TEMPERATUR_SOLLWERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD977
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_LIN_1_ADRESSEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD97B
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_STEUERN_RESET_LIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD97C
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLAPPEN_VERSTELLBEREICH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD980
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_STEUERN_AUTOADR_KLAPPENMOTOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD981
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_TEMPERATUR_MITTE_SOLLWERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD988
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_MISCHLUFT_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD98A
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_ZENTRALANTRIEB_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD98B
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_MISCHLUFT_LINKS_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD98C
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLP_POS_MISCHLUFT_RECHTS_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD98E
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_MIKROSCHALTER_ZENTRALANTRIEB, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD98F
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TEMP_BELUEFTUNG_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD990
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_TEMP_FUSSRAUM_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD991
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VORHANDEN_AUDIOBEDIENTEIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD995
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_POTI_SCHICHTUNG_MITTE_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD998
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_MOT_POS_BEL_FUSS_LI_RE_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD99C
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VARIANTE_AUDIOBEDIENTEIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9A0
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_BUS_OUT_KOMPRESSORKUPPLUNG_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9A1
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VORHANDEN_EKMV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9A4
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_KLIMA_VORN_PRG_HFS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9A8
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_WAERMEPUMPE_SENSOREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9AC
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VORHANDEN_EDH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9AE
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VORHANDEN_WAERMEPUMPE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9AF
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_VORHANDEN_FSH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD9B1
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_SPANNUNG_KLEMME_30_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAD8
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_STATUS_KLEMME_R_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAFD
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_STATUS_KLEMME_15_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAFE
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_STATUS_KLEMME_30B_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB06
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_STATUS_KLEMME_50_EIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB10
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_HV_EDH_STECKVERBINDUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFC0
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_HV_EKMV_STECKVERBINDUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFC1
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_UWB_CPD_DIAGINFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4001
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX_UWB_HKLUSV_DIAGINFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4002
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX__ADC_EINGAENGE_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4010
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX__STAT_STANDHEIZUNG_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4011
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX__STANDHEIZUNG_AUSGANG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4012
//{ I3_ECU_IHX_TX, I3_ECU_IHX_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_IHX__VALEO_LESEN_SPEICHER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4020

View File

@ -1,952 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/kafas20.json: KAF 5D: Camera based driver assistance system
// This generated code makes it easier to process CANBUS messages from the KAF ecu in a BMW i3
//
case I3_PID_KAF__FASTA_FLA_DATA: { // 0x4001
if (datalen < 24) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__FASTA_FLA_DATA", 24);
break;
}
unsigned long STAT_FLA_OP_TIME_WERT = (RXBUF_UINT32(0));
// Duration of FLA activated by driver [s] / Zeitdauer FLA durch Fahrer aktiviert [s]
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_FASTA_FLA_DATA", "STAT_FLA_OP_TIME_WERT", STAT_FLA_OP_TIME_WERT, "\"s\"");
unsigned long STAT_DELTA_TIME_FLA_NIGHT_WERT = (RXBUF_UINT32(4));
// Duration in the ambient brightness FLA activation allowed [s] / Zeitdauer in der Umgebungshelligkeit FLA
// Aktivierung erlaubt [s]
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_FASTA_FLA_DATA", "STAT_DELTA_TIME_FLA_NIGHT_WERT", STAT_DELTA_TIME_FLA_NIGHT_WERT, "\"s\"");
unsigned long STAT_DELTA_TIME_FLA_ACT_HB_WERT = (RXBUF_UINT32(8));
// Duration of switch-on recommendation FLA [s] / Zeitdauer Einschaltempfehlung FLA [s]
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_FASTA_FLA_DATA", "STAT_DELTA_TIME_FLA_ACT_HB_WERT", STAT_DELTA_TIME_FLA_ACT_HB_WERT, "\"s\"");
unsigned long STAT_DELTA_TIME_FLA_ACT_LB_WERT = (RXBUF_UINT32(12));
// Duration of switch-off recommendation [s] / Zeitdauer Abschaltempfehlung [s]
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_FASTA_FLA_DATA", "STAT_DELTA_TIME_FLA_ACT_LB_WERT", STAT_DELTA_TIME_FLA_ACT_LB_WERT, "\"s\"");
unsigned long STAT_FLA_COUNT_OVERRIDE_WERT = (RXBUF_UINT32(16));
// Number of driver overloads / Anzahl Übersteuerung durch Fahrer
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_FASTA_FLA_DATA", "STAT_FLA_COUNT_OVERRIDE_WERT", STAT_FLA_COUNT_OVERRIDE_WERT, "\"Counts\"");
unsigned long STAT_OPTIME_TOTAL_WERT = (RXBUF_UINT32(20));
// Absolute operating time counter [s] / Absoluter Betriebszeitzähler [s]
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_FASTA_FLA_DATA", "STAT_OPTIME_TOTAL_WERT", STAT_OPTIME_TOTAL_WERT, "\"s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__KAFAS_ECU_DATA: { // 0x4002
if (datalen < 38) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__KAFAS_ECU_DATA", 38);
break;
}
unsigned short STAT_CNTRY_CODE_WERT = (RXBUF_UINT(0));
// ISO Country Code of the country in which the vehicle covered the most kilometers. / ISO Country Code des
// Landes in welchem das Fahrzeug die meisten Kilometer zurückgelegt hat.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_CNTRY_CODE_WERT", STAT_CNTRY_CODE_WERT, "\"Counts\"");
unsigned long STAT_OPTIME_TOTAL_WERT_0X4002 = (RXBUF_UINT32(2));
// Absolute operating time counter / Absoluter Betriebszeitzähler
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_OPTIME_TOTAL_WERT_0X4002", STAT_OPTIME_TOTAL_WERT_0X4002, "\"s\"");
unsigned long STAT_OPTIME_NIGHT_WERT = (RXBUF_UINT32(6));
// Operating time at night. Based on BV-Algo overnight decision / Betriebszeit in der Nacht. Basiert auf BV-Algo
// Nachtentscheidung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_OPTIME_NIGHT_WERT", STAT_OPTIME_NIGHT_WERT, "\"s\"");
unsigned long STAT_OPTIME_WIPER_WERT = (RXBUF_UINT32(10));
// Operating time during rain. Based on Algo Rain Decision / Betriebszeit während Regen. Basiert auf Algo
// Regenentscheidung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_OPTIME_WIPER_WERT", STAT_OPTIME_WIPER_WERT, "\"s\"");
unsigned long STAT_DRIVEN_DIST_TOTAL_WERT = (RXBUF_UINT32(14));
// Absolutely driven kilometers / Absolut gefahrene Kilometer
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_DRIVEN_DIST_TOTAL_WERT", STAT_DRIVEN_DIST_TOTAL_WERT, "\"km\"");
unsigned long STAT_DRIVEN_DIST_URBAN_WERT = (RXBUF_UINT32(18));
// Total kilometers driven on urban or residential area roads / Absolut gefahrene Kilometer auf Straßentyp Urban
// oder Residential Area
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_DRIVEN_DIST_URBAN_WERT", STAT_DRIVEN_DIST_URBAN_WERT, "\"km\"");
unsigned long STAT_DRIVEN_DIST_RURAL_WERT = (RXBUF_UINT32(22));
// Absolute kilometers driven on the rural or highway type / Absolut gefahrene Kilometer auf Straßentyp Rural
// oder Highway
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_DRIVEN_DIST_RURAL_WERT", STAT_DRIVEN_DIST_RURAL_WERT, "\"km\"");
unsigned long STAT_DRIVEN_DIST_MOWAY_WERT = (RXBUF_UINT32(26));
// Absolute kilometers driven on road type Motorway / Absolut gefahrene Kilometer auf Straßentyp Motorway
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_DRIVEN_DIST_MOWAY_WERT", STAT_DRIVEN_DIST_MOWAY_WERT, "\"km\"");
unsigned long STAT_DRIVEN_DIST_NA_WERT = (RXBUF_UINT32(30));
// Absolute kilometers driven with no available road type / Absolut gefahrene Kilometer ohne verfügbaren
// Straßentyp
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_DRIVEN_DIST_NA_WERT", STAT_DRIVEN_DIST_NA_WERT, "\"km\"");
unsigned short STAT_AMNT_EYEQ_RESET_WERT = (RXBUF_UINT(34));
// Number of resets of the BV processor performed during normal operation / Anzahl der erfolgten Resets des
// BV-Prozessors während normalem Betrieb
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_AMNT_EYEQ_RESET_WERT", STAT_AMNT_EYEQ_RESET_WERT, "\"Counts\"");
unsigned short STAT_AMNT_ONLINE_CALIB_WERT = (RXBUF_UINT(36));
// Counter for the completed online calibration processes / Zähler über die Erfolgten Online-Kalibriervorgänge
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_ECU_DATA", "STAT_AMNT_ONLINE_CALIB_WERT", STAT_AMNT_ONLINE_CALIB_WERT, "\"Counts\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__KAFAS_TLC_DATA: { // 0x4003
if (datalen < 20) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__KAFAS_TLC_DATA", 20);
break;
}
unsigned long STAT_TLC_DRIV_LEFT_AVAIL_WERT = (RXBUF_UINT32(0));
// Absolute kilometers driven with availability on the left / Absolut gefahrene Kilometer mit Verfübarkeit auf
// der linken Seite
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_TLC_DATA", "STAT_TLC_DRIV_LEFT_AVAIL_WERT", STAT_TLC_DRIV_LEFT_AVAIL_WERT, "\"km\"");
unsigned long STAT_TLC_DRIV_RIGHT_AVAIL_WERT = (RXBUF_UINT32(4));
// Absolute kilometers driven with availability on the right / Absolut gefahrene Kilometer mit Verfübarkeit auf
// der rechten Seite
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_TLC_DATA", "STAT_TLC_DRIV_RIGHT_AVAIL_WERT", STAT_TLC_DRIV_RIGHT_AVAIL_WERT, "\"km\"");
unsigned long STAT_TLC_DRIV_DIST_REL_SPD_WERT = (RXBUF_UINT32(8));
// Absolutely driven with active TLC and relevant speed / Absolut gefahrene mit aktivem TLC und relavanter
// Geschwindigkeit
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_TLC_DATA", "STAT_TLC_DRIV_DIST_REL_SPD_WERT", STAT_TLC_DRIV_DIST_REL_SPD_WERT, "\"km\"");
unsigned short STAT_TLC_AMNT_WARN_WERT = (RXBUF_UINT(12));
// Number of issued TLC warnings / Anzahl ausgegebener TLC Warnungen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_TLC_DATA", "STAT_TLC_AMNT_WARN_WERT", STAT_TLC_AMNT_WARN_WERT, "\"Counts\"");
unsigned short STAT_TLC_AMNT_DEACT_WERT = (RXBUF_UINT(14));
// Number of times the TLC function was deactivated by the driver / Anzahl der Deaktivierung der TLC-Funktion
// durch den Fahrer
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_TLC_DATA", "STAT_TLC_AMNT_DEACT_WERT", STAT_TLC_AMNT_DEACT_WERT, "\"Counts\"");
unsigned long STAT_TLC_DRIV_DIST_ACT_WERT = (RXBUF_UINT32(16));
// Kilometers driven with activated TLC / Gefahrene Kilometer mit aktiviertem TLC
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_TLC_DATA", "STAT_TLC_DRIV_DIST_ACT_WERT", STAT_TLC_DRIV_DIST_ACT_WERT, "\"km\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_KAFAS_FCW_DATA: { // 0x4004
if (datalen < 42) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_KAFAS_FCW_DATA", 42);
break;
}
unsigned long STAT_FCW_DRIVEN_DIST_ACT_WERT = (RXBUF_UINT32(0));
// Total kilometers driven with activated FCW function / Absolut gefahrene Kilometer mit aktivierter FCW Funktion
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_DRIVEN_DIST_ACT_WERT", STAT_FCW_DRIVEN_DIST_ACT_WERT, "\"km\"");
unsigned long STAT_FCW_DRIVEN_DIST_FS_WERT = (RXBUF_UINT32(4));
// Total kilometers driven in fail safe mode / Absolut gefahrene Kilometer im Fail Safe Mode
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_DRIVEN_DIST_FS_WERT", STAT_FCW_DRIVEN_DIST_FS_WERT, "\"km\"");
unsigned long STAT_FCW_DRIVEN_DIST_FS_ACT_WERT = (RXBUF_UINT32(8));
// Total kilometers driven with activated FCW function in fail safe mode / Absolut gefahrene Kilometer mit
// aktivierter FCW Funktion im Fail Safe Mode
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_DRIVEN_DIST_FS_ACT_WERT", STAT_FCW_DRIVEN_DIST_FS_ACT_WERT, "\"km\"");
unsigned long STAT_FCW_DRIVEN_DIST_FOR_OFF_WERT = (RXBUF_UINT32(12));
// Absolutely driven kilometers with activated FCW function and advance warning level off / Absolut gefahrene
// Kilometer mit aktivierter FCW Funktion und Vorwarnstufe aus
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_DRIVEN_DIST_FOR_OFF_WERT", STAT_FCW_DRIVEN_DIST_FOR_OFF_WERT, "\"km\"");
unsigned long STAT_FCW_DRIVEN_DIST_FOR_EARLY_WERT = (RXBUF_UINT32(16));
// Total kilometers traveled with activated FCW function and early warning level / Absolut gefahrene Kilometer
// mit aktivierter FCW Funktion und Vorwarnstufe früh
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_DRIVEN_DIST_FOR_EARLY_WERT", STAT_FCW_DRIVEN_DIST_FOR_EARLY_WERT, "\"km\"");
unsigned long STAT_FCW_DRIVEN_DIST_FOR_LATE_WERT = (RXBUF_UINT32(20));
// Total kilometers driven with activated FCW function and late warning level / Absolut gefahrene Kilometer mit
// aktivierter FCW Funktion und Vorwarnstufe spät
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_DRIVEN_DIST_FOR_LATE_WERT", STAT_FCW_DRIVEN_DIST_FOR_LATE_WERT, "\"km\"");
unsigned short STAT_FCW_AMNT_FOR_WERT = (RXBUF_UINT(24));
// Number of pre-warnings / Anzahl der Vorwarnungen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_AMNT_FOR_WERT", STAT_FCW_AMNT_FOR_WERT, "\"Counts\"");
unsigned short STAT_FCW_AMNT_ACUTE_WERT = (RXBUF_UINT(26));
// Number of acute warnings / Anzahl der Akutwarnungen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_AMNT_ACUTE_WERT", STAT_FCW_AMNT_ACUTE_WERT, "\"Counts\"");
unsigned short STAT_FCW_AMNT_ACUTE_45_WERT = (RXBUF_UINT(28));
// Number of acute warnings in the range 0 km / h¿ 45 km / h / Anzahl der Akutwarnungen im Bereich 0 km/h¿ 45
// km/h
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_AMNT_ACUTE_45_WERT", STAT_FCW_AMNT_ACUTE_45_WERT, "\"Counts\"");
unsigned short STAT_FCW_AMNT_ACUTE_90_WERT = (RXBUF_UINT(30));
// Number of acute warnings in the range 45 km / h¿ 90 km / h / Anzahl der Akutwarnungen im Bereich 45 km/h¿ 90
// km/h
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_AMNT_ACUTE_90_WERT", STAT_FCW_AMNT_ACUTE_90_WERT, "\"Counts\"");
unsigned short STAT_FCW_AMNT_ACUTE_135_WERT = (RXBUF_UINT(32));
// Number of acute warnings in the range 90 km / h¿ 135 km / h / Anzahl der Akutwarnungen im Bereich 90 km/h¿ 135
// km/h
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_AMNT_ACUTE_135_WERT", STAT_FCW_AMNT_ACUTE_135_WERT, "\"Counts\"");
unsigned short STAT_FCW_PREFILLS_WERT = (RXBUF_UINT(34));
// Number of pre-fill requests triggered by FCW / Anzahl der von FCW ausgelösten Pre-Fill Anforderungen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_PREFILLS_WERT", STAT_FCW_PREFILLS_WERT, "\"Counts\"");
unsigned short STAT_FCW_PRECRASH_WERT = (RXBUF_UINT(36));
// Number of pre-crash messages triggered by FCW / Anzahl der von FCW ausgelösten Pre-Crash Meldungen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_PRECRASH_WERT", STAT_FCW_PRECRASH_WERT, "\"Counts\"");
unsigned short STAT_FCW_DEACT_WERT = (RXBUF_UINT(38));
// Number of times the FCW function has been deactivated by the driver / Anzahl der Deaktivierung der
// FCW-Funktion durch den Fahrer
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_DEACT_WERT", STAT_FCW_DEACT_WERT, "\"Counts\"");
unsigned short STAT_FCW_FS_CC_WERT = (RXBUF_UINT(40));
// Number of triggered Fail-Save CC messages / Anzahl der ausgelösten Fail-Save CC-Meldungen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KAFAS_FCW_DATA", "STAT_FCW_FS_CC_WERT", STAT_FCW_FS_CC_WERT, "\"Counts\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__KAFAS_SLI_DATA: { // 0x4005
if (datalen < 27) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__KAFAS_SLI_DATA", 27);
break;
}
unsigned long STAT_SLI_AMT_CAM_DET_WERT = (RXBUF_UINT32(0));
// Number of camera detections of traffic signs / Anzahl der Kameradetektionen von Verkehrsschildern
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_AMT_CAM_DET_WERT", STAT_SLI_AMT_CAM_DET_WERT, "\"Counts\"");
char STAT_SLI_MATCH_URBAN_WERT = (RXBUF_UCHAR(4));
// Share of camera detection that match the explicit speed limits on the street type Urban or Residential Area /
// Anteil der Kameradetektion die mit den expliziten Speed Limits auf dem Straßentyp Urban oder Residential Area
// übereinstimmen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_MATCH_URBAN_WERT", STAT_SLI_MATCH_URBAN_WERT, "\"Counts\"");
char STAT_SLI_MATCH_RURAL_WERT = (RXBUF_UCHAR(5));
// Proportion of camera detection that corresponds to the explicit speed limits on the road type rural or highway
// / Anteil der Kameradetektion die mit den expliziten Speed Limits auf dem Straßentyp Rural oder Highway
// übereinstimmen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_MATCH_RURAL_WERT", STAT_SLI_MATCH_RURAL_WERT, "\"Counts\"");
char STAT_SLI_MATCH_MOWAY_WERT = (RXBUF_UCHAR(6));
// Percentage of camera detection that corresponds to the explicit speed limits on the road type Motorway /
// Anteil der Kameradetektion die mit den expliziten Speed Limits auf dem Straßentyp Motorway übereinstimmen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_MATCH_MOWAY_WERT", STAT_SLI_MATCH_MOWAY_WERT, "\"Counts\"");
unsigned short STAT_SLI_REP_URBAN_WERT = (RXBUF_UINT(7));
// Average distance at which signs repeat on the street type Urban or Residential Area / Durschnittlich Enfernung
// in welcher sich Schilder auf dem Straßentyp Urbanoder Residential Area wiederholen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_REP_URBAN_WERT", STAT_SLI_REP_URBAN_WERT, "\"m\"");
unsigned short STAT_SLI_REP_RURAL_WERT = (RXBUF_UINT(9));
// Average distance at which signs repeat on the road type rural or highway / Durschnittlich Enfernung in welcher
// sich Schilder auf dem Straßentyp Rural oder Highway wiederholen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_REP_RURAL_WERT", STAT_SLI_REP_RURAL_WERT, "\"m\"");
unsigned short STAT_SLI_REP_MOWAY_WERT = (RXBUF_UINT(11));
// Average distance at which signs repeat on the road type Motorway / Durschnittlich Enfernung in welcher sich
// Schilder auf dem Straßentyp Motorway wiederholen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_REP_MOWAY_WERT", STAT_SLI_REP_MOWAY_WERT, "\"m\"");
unsigned long STAT_SLI_OVER_SLI_WERT = (RXBUF_UINT32(13));
// Distance driven at least 20 km / h above the detected speed limit / Gefahrene Entfernung mit mindestens 20
// km/h über dem erkannten Speed Limit
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_OVER_SLI_WERT", STAT_SLI_OVER_SLI_WERT, "\"km\"");
unsigned short STAT_SLI_SSS_TIME_WERT = (RXBUF_UINT(17));
// Number of recognized additional characters with time restriction / Anzahl der erkannten Zusatzzeichen mit
// Zeitbeschränkung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_SSS_TIME_WERT", STAT_SLI_SSS_TIME_WERT, "\"Counts\"");
unsigned long STAT_SLI_NPI_WERT = (RXBUF_UINT32(19));
// Kilometers driven with no overtaking recognized / Gefahrene Kilometer mit erkanntem Überholverbot
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_NPI_WERT", STAT_SLI_NPI_WERT, "\"km\"");
unsigned short STAT_SLI_NP_WITHDRAW_DIST_WERT = (RXBUF_UINT(23));
// Number of cancellations of overtaking ban due to exceeding the stopping distance / Anzahl Aufhebungen
// Überholverbot infolge Überschreitung Haltedistanz
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_NP_WITHDRAW_DIST_WERT", STAT_SLI_NP_WITHDRAW_DIST_WERT, "\"Counts\"");
unsigned short STAT_SLI_NP_WITHDRAW_SIGN_WERT = (RXBUF_UINT(25));
// Number of cancellations No overtaking due to detection of a lifting sign / Anzahl Aufhebungen Überholverbot
// infolge Detektion Aufhebungsschild
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_KAFAS_SLI_DATA", "STAT_SLI_NP_WITHDRAW_SIGN_WERT", STAT_SLI_NP_WITHDRAW_SIGN_WERT, "\"Counts\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__STATUS_SAFETY_DIAG_INFO: { // 0x400E
if (datalen < 7) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__STATUS_SAFETY_DIAG_INFO", 7);
break;
}
unsigned char STAT_BYTE_0_FAULT_WERT = (RXBUF_UCHAR(0));
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0
// UP1V0D_freeze_fault 1 UP1V8D_freeze_fault 2 UP2V5D_freeze_fault 3 UP3V3D_freeze_fault 4 UP5V0D_freeze_fault 5
// VTEMP1_freeze_fault 6 VTEMP2_freeze_fault 7 V_BAT1_freeze_fault / The parameter values shall indicate 0 for
// fault_not_present and 1 for fault_present. Bit: 0 UP1V0D_freeze_fault 1 UP1V8D_freeze_fault 2
// UP2V5D_freeze_fault 3 UP3V3D_freeze_fault 4 UP5V0D_freeze_fault 5 VTEMP1_freeze_fault 6 VTEMP2_freeze_fault 7
// V_BAT1_freeze_fault
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_SAFETY_DIAG_INFO", "STAT_BYTE_0_FAULT_WERT", STAT_BYTE_0_FAULT_WERT, "\"HEX\"");
unsigned char STAT_BYTE_1_FAULT_WERT = (RXBUF_UCHAR(1));
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0
// UP1V0D_freeze_fault 1 UP1V8D_freeze_fault 2 UP2V5D_freeze_fault 3 UP3V3D_freeze_fault 4 UP5V0D_freeze_fault 5
// VTEMP1_freeze_fault 6 VTEMP2_freeze_fault 7 V_BAT1_freeze_fault / The parameter values shall indicate 0 for
// fault_not_present and 1 for fault_present. Bit: 0 UP1V0D_freeze_fault 1 UP1V8D_freeze_fault 2
// UP2V5D_freeze_fault 3 UP3V3D_freeze_fault 4 UP5V0D_freeze_fault 5 VTEMP1_freeze_fault 6 VTEMP2_freeze_fault 7
// V_BAT1_freeze_fault
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_SAFETY_DIAG_INFO", "STAT_BYTE_1_FAULT_WERT", STAT_BYTE_1_FAULT_WERT, "\"HEX\"");
unsigned char STAT_BYTE_2_FAULT_WERT = (RXBUF_UCHAR(2));
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0
// UP1V0D_voltage_fault 1 UP1V8D_voltage_fault 2 UP2V5D_voltage_fault 3 UP3V3D_voltage_fault 4
// UP5V0D_voltage_fault 5 VTEMP1_temperature_fault 6 VTEMP2_temperature_fault 7 V_BAT1_voltage_fault / The
// parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 UP1V0D_voltage_fault
// 1 UP1V8D_voltage_fault 2 UP2V5D_voltage_fault 3 UP3V3D_voltage_fault 4 UP5V0D_voltage_fault 5
// VTEMP1_temperature_fault 6 VTEMP2_temperature_fault 7 V_BAT1_voltage_fault
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_SAFETY_DIAG_INFO", "STAT_BYTE_2_FAULT_WERT", STAT_BYTE_2_FAULT_WERT, "\"HEX\"");
unsigned char STAT_BYTE_3_FAULT_WERT = (RXBUF_UCHAR(3));
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0
// ECU_inconsistent_temperature_fault / The parameter values shall indicate 0 for fault_not_present and 1 for
// fault_present. Bit: 0 ECU_inconsistent_temperature_fault
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_SAFETY_DIAG_INFO", "STAT_BYTE_3_FAULT_WERT", STAT_BYTE_3_FAULT_WERT, "\"HEX\"");
unsigned char STAT_BYTE_4_FAULT_WERT = (RXBUF_UCHAR(4));
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 Eq2Unavailable 1
// Eq2FaultHandlingAliveError 2 Eq2FaultHandlingCrcError 3 VideoError_400 4 TempStatus_400 5 CamLVDS_Defect_400 6
// CamEEP_Fail_400 7 BurntPixel_400 / The parameter values shall indicate 0 for fault_not_present and 1 for
// fault_present. Bit: 0 Eq2Unavailable 1 Eq2FaultHandlingAliveError 2 Eq2FaultHandlingCrcError 3 VideoError_400
// 4 TempStatus_400 5 CamLVDS_Defect_400 6 CamEEP_Fail_400 7 BurntPixel_400
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_SAFETY_DIAG_INFO", "STAT_BYTE_4_FAULT_WERT", STAT_BYTE_4_FAULT_WERT, "\"HEX\"");
unsigned char STAT_BYTE_5_FAULT_WERT = (RXBUF_UCHAR(5));
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 DDR_Failure_400 1
// WdgMSafetyAliveSupervisonFault / The parameter values shall indicate 0 for fault_not_present and 1 for
// fault_present. Bit: 0 DDR_Failure_400 1 WdgMSafetyAliveSupervisonFault
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_SAFETY_DIAG_INFO", "STAT_BYTE_5_FAULT_WERT", STAT_BYTE_5_FAULT_WERT, "\"HEX\"");
unsigned char STAT_BYTE_6_FAULT_WERT = (RXBUF_UCHAR(6));
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 ActiveFaultClass
// Bit 0 * 1 ActiveFaultClass Bit 1 * 2 ActiveFaultClass Bit 2 * 3 (not disp_drasy_available) 4 (not
// aAssistFunctionAvailable) 5 (not qAssistActive) 6 Not in use 7 Safe state entered disp_drasy_available means
// that the bit is 0 when the signal is available, and 1 when it is not available / The parameter values shall
// indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 ActiveFaultClass Bit 0* 1 ActiveFaultClass
// Bit 1* 2 ActiveFaultClass Bit 2* 3 (not disp_drasy_available) 4 (not aAssistFunctionAvailable) 5 (not
// qAssistActive) 6 Not in use 7 Safe state entered disp_drasy_available means that the bit is 0 when the
// signal is availablem, and 1 when it is not available
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_SAFETY_DIAG_INFO", "STAT_BYTE_6_FAULT_WERT", STAT_BYTE_6_FAULT_WERT, "\"HEX\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__STATUS_WARNZEITPUNKT_FCW: { // 0x400F
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__STATUS_WARNZEITPUNKT_FCW", 1);
break;
}
unsigned char STAT_WARN_FLAV_FCW = (RXBUF_UCHAR(0));
// currently selected warning flavor / currently selected warning flavor
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_WARNZEITPUNKT_FCW", "STAT_WARN_FLAV_FCW", STAT_WARN_FLAV_FCW, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_FASTA_PPP_DATA: { // 0x4010
if (datalen < 50) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_FASTA_PPP_DATA", 50);
break;
}
unsigned short STAT_PPP_WARNING_ZONE = (RXBUF_UINT(0));
// Type of warning zone / Art der Warnzone
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_WARNING_ZONE", STAT_PPP_WARNING_ZONE, "\"0-n\"");
unsigned short STAT_PPP_AMNT_DZ_EVENTS_0_TO_20_WERT = (RXBUF_UINT(2));
// The parameter is determined by counting the number of DZ events in the range 0 <x <20 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der DZ-Events im Bereich 0 < x < 20 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_DZ_EVENTS_0_TO_20_WERT", STAT_PPP_AMNT_DZ_EVENTS_0_TO_20_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_DZ_EVENTS_20_TO_40_WERT = (RXBUF_UINT(4));
// The parameter is determined by counting the number of DZ events in the range 20 <x <40 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der DZ-Events im Bereich 20 < x < 40 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_DZ_EVENTS_20_TO_40_WERT", STAT_PPP_AMNT_DZ_EVENTS_20_TO_40_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_DZ_EVENTS_40_TO_60_WERT = (RXBUF_UINT(6));
// The parameter is determined by counting the number of DZ events in the range 40 <x <60 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der DZ-Events im Bereich 40 < x < 60 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_DZ_EVENTS_40_TO_60_WERT", STAT_PPP_AMNT_DZ_EVENTS_40_TO_60_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_PDZ1_EVENTS_0_TO_20_WERT = (RXBUF_UINT(8));
// The parameter is determined by counting the number of PDZ1 events in the range 0 <x <20 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der PDZ1-Events im Bereich 0 < x < 20 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_PDZ1_EVENTS_0_TO_20_WERT", STAT_PPP_AMNT_PDZ1_EVENTS_0_TO_20_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_PDZ1_EVENTS_20_TO_40_WERT = (RXBUF_UINT(10));
// The parameter is determined by counting the number of PDZ1 events in the range 20 <x <40 km / h / Die
// Kenngröße wird bestimmt, indem die Anzahl der PDZ1-Events im Bereich 20 < x < 40 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_PDZ1_EVENTS_20_TO_40_WERT", STAT_PPP_AMNT_PDZ1_EVENTS_20_TO_40_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_PDZ1_EVENTS_40_TO_60_WERT = (RXBUF_UINT(12));
// The parameter is determined by counting the number of PDZ1 events in the range 40 <x <60 km / h / Die
// Kenngröße wird bestimmt, indem die Anzahl der PDZ1-Events im Bereich 40 < x < 60 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_PDZ1_EVENTS_40_TO_60_WERT", STAT_PPP_AMNT_PDZ1_EVENTS_40_TO_60_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_PDZ2_EVENTS_0_TO_20_WERT = (RXBUF_UINT(14));
// The parameter is determined by counting the number of PDZ2 events in the range 0 <x <20 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der PDZ2-Events im Bereich 0 < x < 20 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_PDZ2_EVENTS_0_TO_20_WERT", STAT_PPP_AMNT_PDZ2_EVENTS_0_TO_20_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_PDZ2_EVENTS_20_TO_40_WERT = (RXBUF_UINT(16));
// The parameter is determined by counting the number of PDZ2 events in the range 20 <x <40 km / h / Die
// Kenngröße wird bestimmt, indem die Anzahl der PDZ2-Events im Bereich 20 < x < 40 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_PDZ2_EVENTS_20_TO_40_WERT", STAT_PPP_AMNT_PDZ2_EVENTS_20_TO_40_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_PDZ2_EVENTS_40_TO_60_WERT = (RXBUF_UINT(18));
// The parameter is determined by counting the number of PDZ2 events in the range 40 <x <60 km / h / Die
// Kenngröße wird bestimmt, indem die Anzahl der PDZ2-Events im Bereich 40 < x < 60 km/h gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_PDZ2_EVENTS_40_TO_60_WERT", STAT_PPP_AMNT_PDZ2_EVENTS_40_TO_60_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_PREWARNUNG_REQUESTS_WERT = (RXBUF_UINT(20));
// The parameter is determined by counting the number of pre-warning requests / Die Kenngröße wird bestimmt,
// indem die Anzahl der Pre-Warning-Requests gezählt wird
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_PREWARNUNG_REQUESTS_WERT", STAT_PPP_AMNT_PREWARNUNG_REQUESTS_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_ACUTEWARNING_REQUESTS_WERT = (RXBUF_UINT(22));
// The parameter is determined by counting the number of acute warning requests. / Die Kenngröße wird bestimmt,
// indem die Anzahl der Acute-Warning-Requests gezählt wird.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_ACUTEWARNING_REQUESTS_WERT", STAT_PPP_AMNT_ACUTEWARNING_REQUESTS_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_HBA_REQUESTS_WERT = (RXBUF_UINT(24));
// The parameter is determined by counting the number of HBA requests. / Die Kenngröße wird bestimmt, indem die
// Anzahl der HBA-Requests gezählt wird.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_HBA_REQUESTS_WERT", STAT_PPP_AMNT_HBA_REQUESTS_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_PREFILL_REQUESTS_WERT = (RXBUF_UINT(26));
// The parameter is determined by counting the number of prefill requests. / Die Kenngröße wird bestimmt, indem
// die Anzahl der Prefill-Requests gezählt wird.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_PREFILL_REQUESTS_WERT", STAT_PPP_AMNT_PREFILL_REQUESTS_WERT, "\"Counts\"");
unsigned short STAT_PPP_AMNT_BRAKE_REQUESTS_WERT = (RXBUF_UINT(28));
// The parameter is determined by counting the number of brake requests. / Die Kenngröße wird bestimmt, indem die
// Anzahl der Brake-Requests gezählt wird.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_AMNT_BRAKE_REQUESTS_WERT", STAT_PPP_AMNT_BRAKE_REQUESTS_WERT, "\"Counts\"");
unsigned short STAT_PPP_DEACT_DRIVER_WERT = (RXBUF_UINT(30));
// The parameter is determined by counting the number of times the pFGS function was switched off by the driver.
// (Status change of the activation by pressing the button) / Die Kenngröße wird bestimmt, indem die Anzahl der
// Abschaltungen der Funktion pFGS durch den Fahrer gezählt wird. (Statuswechsel der Aktivierung durch
// Tasterbetätigung)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_DEACT_DRIVER_WERT", STAT_PPP_DEACT_DRIVER_WERT, "\"Counts\"");
unsigned short STAT_PPP_DEACT_AVAILABILITY_WERT = (RXBUF_UINT(32));
// The parameter is determined by counting the number of times the pFGS function was switched off by the KAFAS
// system based on the availability concept (e.g. recognition qualifier, degradation concept, ...). / Die
// Kenngröße wird bestimmt, indem die Anzahl der Abschaltungen der Funktion pFGS durch das KAFAS System aufgrund
// des Verfügbarkeitskonzeptes (z.B. Erkennungsqualifier, Degradationskonzept,...) gezählt wird.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_DEACT_AVAILABILITY_WERT", STAT_PPP_DEACT_AVAILABILITY_WERT, "\"Counts\"");
unsigned short STAT_PPP_DEACT_WARNING_CHAIN_WERT = (RXBUF_UINT(34));
// The parameter is determined by counting the number of times the pPP function has been switched off by the
// KAFAS system based on the braking and warning chain. / Die Kenngröße wird bestimmt, indem die Anzahl der
// Abschaltungen der Funktion pPP durch das KAFAS System aufgrund der Brems-und Warnkette gezählt wird.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_DEACT_WARNING_CHAIN_WERT", STAT_PPP_DEACT_WARNING_CHAIN_WERT, "\"Counts\"");
unsigned long STAT_PPP_OPERATION_TIME_CL50_WERT = (RXBUF_UINT32(36));
// The parameter is determined by always counting the operating time in seconds from terminal 50. / Die Kenngröße
// wird bestimmt, indem immer ab Kl 50 die Betriebszeit in Sekunden gezählt wird.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_OPERATION_TIME_CL50_WERT", STAT_PPP_OPERATION_TIME_CL50_WERT, "\"s\"");
unsigned long STAT_PPP_OPERATION_TIME_ACTIVE_WERT = (RXBUF_UINT32(40));
// The parameter is determined by always counting the operating time in seconds from terminal 50 while the pFGS
// function is activated. / Die Kenngröße wird bestimmt, indem immer ab Kl 50 die Betriebszeit in Sekunden
// gezählt wird, während die pFGS-Funktion aktiviert ist.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_OPERATION_TIME_ACTIVE_WERT", STAT_PPP_OPERATION_TIME_ACTIVE_WERT, "\"s\"");
unsigned short STAT_PPP_FS_CC_WERT = (RXBUF_UINT(44));
// The parameter is determined by counting the number of Check Control messages triggered due to reduced
// visibility for the pFGS function. / Die Kenngröße wird bestimmt, indem die Anzahl der ausgelösten Check
// Control Meldungen aufgrund reduzierter Sicht für die Funktion pFGS gezählt wird.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_FS_CC_WERT", STAT_PPP_FS_CC_WERT, "\"Counts\"");
unsigned long STAT_PPP_DRIVEN_TIME_FS_ACT_WERT = (RXBUF_UINT32(46));
// The parameter is determined by determining the operating time from Kl 50 in seconds in which pFGS is in the
// reduced visibility status and activated by the driver. / Die Kenngröße wird bestimmt, indem die Betriebszeit
// ab Kl 50 in Sekunden ermittelt wird, in der pFGS im Status reduzierte Sicht und vom Fahrer aktiviert ist.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "FASTA_PPP_DATA", "STAT_PPP_DRIVEN_TIME_FS_ACT_WERT", STAT_PPP_DRIVEN_TIME_FS_ACT_WERT, "\"s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_FASTA_CCM_DATA: { // 0x4011
if (datalen < 6) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_FASTA_CCM_DATA", 6);
break;
}
unsigned short STAT_CCM_AMNT_BRAKE_20_WERT = (RXBUF_UINT(0));
// The parameter is determined by counting the number of CCM brakes in which the speed of the host vehicle at the
// start of braking is greater than or equal to 0 km / h and less than 20 km / h. / Die Kenngröße wird bestimmt,
// indem die Anzahl der CCM-Bremsungen gezählt wird, bei denen die Geschwindigkeit des Egofahrzeugs zu
// Bremsbeginn größer gleich 0 km/h und kleiner 20 km/h ist.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_CCM_DATA", "STAT_CCM_AMNT_BRAKE_20_WERT", STAT_CCM_AMNT_BRAKE_20_WERT, "\"Counts\"");
unsigned short STAT_CCM_AMNT_BRAKE_40_WERT = (RXBUF_UINT(2));
// The parameter is determined by counting the number of CCM brakes in which the speed of the host vehicle at the
// start of braking is greater than or equal to 20 km / h and less than 40 km / h. / Die Kenngröße wird bestimmt,
// indem die Anzahl der CCM-Bremsungen gezählt wird, bei denen die Geschwindigkeit des Egofahrzeugs zu
// Bremsbeginn größer gleich 20 km/h und kleiner 40 km/h ist.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_CCM_DATA", "STAT_CCM_AMNT_BRAKE_40_WERT", STAT_CCM_AMNT_BRAKE_40_WERT, "\"Counts\"");
unsigned short STAT_CCM_AMNT_BRAKE_GEQ40_WERT = (RXBUF_UINT(4));
// The parameter is determined by counting the number of CCM brakes in which the speed of the host vehicle is
// greater than or equal to 40 km / h at the beginning of the braking / Die Kenngröße wird bestimmt, indem die
// Anzahl der CCM-Bremsungen gezählt wird, bei denen die Geschwindigkeit des Egofahrzeugs zu Bremsbeginn größer
// gleich 40 km/h ist
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "FASTA_CCM_DATA", "STAT_CCM_AMNT_BRAKE_GEQ40_WERT", STAT_CCM_AMNT_BRAKE_GEQ40_WERT, "\"Counts\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__KAFAS_ENVINT_DATA: { // 0x4012
if (datalen < 8) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__KAFAS_ENVINT_DATA", 8);
break;
}
unsigned long STAT_ENVINT_DRIVEN_DIST_FS_WERT = (RXBUF_UINT32(0));
// Cont the number of km driven with degraded availability / Cont the number of km driven with degraded
// availability
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ENVINT_DATA", "STAT_ENVINT_DRIVEN_DIST_FS_WERT", STAT_ENVINT_DRIVEN_DIST_FS_WERT, "\"km\"");
unsigned long STAT_ENVINT_DRIVEN_TIME_FS_WERT = (RXBUF_UINT32(4));
// Count the time in seconds driven with degraded availability / Count the time in seconds driven with degraded
// availability
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "_KAFAS_ENVINT_DATA", "STAT_ENVINT_DRIVEN_TIME_FS_WERT", STAT_ENVINT_DRIVEN_TIME_FS_WERT, "\"s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_PPP_ANFORDERUNGEN: { // 0x4016
if (datalen < 9) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_PPP_ANFORDERUNGEN", 9);
break;
}
unsigned char STAT_TYPE_OF_WARNING = (RXBUF_UCHAR(0));
// 0x01 if only a Brake request according to 2) is triggered 0x02 if only an Acute warning request according to
// 1) is triggered 0x03 if both an Acute warning request and a Brake request is triggered / 0x01 if only a Brake
// request according to 2) is triggered 0x02 if only an Acute warning request according to 1) is triggered 0x03
// if both an Acute warning request and a Brake request is triggered
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "PPP_ANFORDERUNGEN", "STAT_TYPE_OF_WARNING", STAT_TYPE_OF_WARNING, "\"0-n\"");
unsigned long STAT_TIMESTAMP_ACUTE_WERT = (RXBUF_UINT32(1));
// The time stamp is the system time value (message 328h) when the warning happened / The time stamp is the
// system time value (message 328h) when the warning happened
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "PPP_ANFORDERUNGEN", "STAT_TIMESTAMP_ACUTE_WERT", STAT_TIMESTAMP_ACUTE_WERT, "\"s\"");
unsigned long STAT_TIMESTAMP_BRAKE_WERT = (RXBUF_UINT32(5));
// The time stamp is the system time value (message 328h) when the warning happened. / The time stamp is the
// system time value (message 328h) when the warning happened.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KAF", "PPP_ANFORDERUNGEN", "STAT_TIMESTAMP_BRAKE_WERT", STAT_TIMESTAMP_BRAKE_WERT, "\"s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__GENERIC_EYEQ2_INFO: { // 0x4017
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__GENERIC_EYEQ2_INFO", 1);
break;
}
unsigned char STAT_EYEQ2_RESTARTS_WERT = (RXBUF_UCHAR(0));
// EyeQ2 restarts, 1 byte Counter for number of EyeQ2 restarts caused by camera error debouncing as described in
// DTC 0x800ABB - Camera Connection Error / EyeQ2 restarts, 1 byte Counter for number of EyeQ2 restarts caused by
// camera error debouncing as described in DTC 0x800ABB - Camera Connection Error
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_GENERIC_EYEQ2_INFO", "STAT_EYEQ2_RESTARTS_WERT", STAT_EYEQ2_RESTARTS_WERT, "\"Counts\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__STATUS_CAMERA_MONITORING_WERT: { // 0x4050
if (datalen < 7) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__STATUS_CAMERA_MONITORING_WERT", 7);
break;
}
unsigned short STAT_FRAME_INDEX_WERT = (RXBUF_UINT(0));
// This is a frame counter, that shall be increased for every frame that is not skipped. Frames that are skipped
// for any reason shall not increment this counter. When the counter reaches over 65535, it shall restart from 0.
// The counter shall restart from 0 at every startup of the EyeQ2. / This is a frame counter, that shall be
// increased for every frame that is not skipped. Frames that are skipped for any reason shall not increment this
// counter. When the counter reaches over 65535, it shall restart from 0. The counter shall restart from 0 at
// every startup of the EyeQ2.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_STATUS_CAMERA_MONITORING_WERT", "STAT_FRAME_INDEX_WERT", STAT_FRAME_INDEX_WERT, "\"Counts\"");
unsigned short STAT_VIDEO_ERROR_COUNT_WERT = (RXBUF_UINT(2));
// The number of bad frames received from the camera (frames dropped due to data / sync errors). This counter
// shall be increased with one for each cycle the video error signal is set in the 0x400 message. / The number of
// bad frames received from the camera (frames dropped due to data/sync errors). This counter shall be increased
// with one for each cycle the Video error signal is set in the 0x400 message.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_STATUS_CAMERA_MONITORING_WERT", "STAT_VIDEO_ERROR_COUNT_WERT", STAT_VIDEO_ERROR_COUNT_WERT, "\"Counts\"");
unsigned short STAT_DROPPED_FRAME_COUNT_WERT = (RXBUF_UINT(4));
// The number of dropped frames. This counter shall be increased when there is a video error and when the EyeQ2
// skips a frame for any other reason, such as too long processing time for the preceding frame. / The number of
// dropped frames. This counter shall be increased when there is a video error and when the EyeQ2 skips a frame
// for any other reason, such as too long processing time for the preceding frame.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_STATUS_CAMERA_MONITORING_WERT", "STAT_DROPPED_FRAME_COUNT_WERT", STAT_DROPPED_FRAME_COUNT_WERT, "\"Counts\"");
unsigned char STAT_CAMERA_TEMP_WERT = (RXBUF_UCHAR(6)-60.0);
// The camera temperature, as read by the EyeQ2 via I2C. The camera temperature shall be read from the EyeQ2
// every 10 seconds. / The camera temperature, as read by the EyeQ2 via I2C. The camera temperature shall be read
// from the EyeQ2 every 10 seconds.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_STATUS_CAMERA_MONITORING_WERT", "STAT_CAMERA_TEMP_WERT", STAT_CAMERA_TEMP_WERT, "\"°C\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_ABSCHALTGRUND_FERNLICHT: { // 0xD341
if (datalen < 8) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_ABSCHALTGRUND_FERNLICHT", 8);
break;
}
unsigned char STAT_FLA_ENTGEGENKOMMENDES_FAHRZEUG = (RXBUF_UCHAR(0));
// Indicates whether an oncoming vehicle has been detected: 0 = no vehicle detected, 1 = vehicle detected / Gibt
// aus, ob ein entgegenkommendes Fahrzeug erkannt worden ist: 0 = kein Fahrzeug erkannt, 1 = Fahrzeug erkannt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ABSCHALTGRUND_FERNLICHT", "STAT_FLA_ENTGEGENKOMMENDES_FAHRZEUG", STAT_FLA_ENTGEGENKOMMENDES_FAHRZEUG, "\"0/1\"");
unsigned char STAT_FLA_VORAUSFAHRENDES_FAHRZEUG = (RXBUF_UCHAR(1));
// Indicates whether a vehicle in front has been detected: 0 = no vehicle detected, 1 = vehicle detected / Gibt
// aus, ob ein vorausfahrendes Fahrzeug erkannt worden ist: 0 = kein Fahrzeug erkannt, 1 = Fahrzeug erkannt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ABSCHALTGRUND_FERNLICHT", "STAT_FLA_VORAUSFAHRENDES_FAHRZEUG", STAT_FLA_VORAUSFAHRENDES_FAHRZEUG, "\"0/1\"");
unsigned char STAT_FLA_GESCHWINDIGKEITSLIMIT = (RXBUF_UCHAR(2));
// Indicates whether the speed below the limit has been detected: 0 = speed above the threshold, high beam is
// switched on, 1 = speed below the threshold, high beam is switched off / Gibt aus, ob die Geschwindigkeit
// unterhalb der Grenze erkannt worden ist: 0 = Geschwindigkeit oberhalb der Schwelle, Fernlicht wird
// eingeschaltet, 1 = Geschwindigkeit unterhalb der Schwelle, Fernlicht wird abgeschaltet
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ABSCHALTGRUND_FERNLICHT", "STAT_FLA_GESCHWINDIGKEITSLIMIT", STAT_FLA_GESCHWINDIGKEITSLIMIT, "\"0/1\"");
unsigned char STAT_FLA_UMGEBUNGSHELLIGKEIT = (RXBUF_UCHAR(3));
// Indicates whether ambient brightness (day) has been recognized: 0 = no brightness (night) recognized, 1 =
// brightness (day) recognized / Gibt aus, ob Umgebungshelligkeit (Tag) erkannt worden ist: 0 = kein Helligkeit
// (Nacht) erkannt, 1 = Helligkeit (Tag) erkannt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ABSCHALTGRUND_FERNLICHT", "STAT_FLA_UMGEBUNGSHELLIGKEIT", STAT_FLA_UMGEBUNGSHELLIGKEIT, "\"0/1\"");
unsigned char STAT_FLA_ORTSCHAFTSERKENNUNG = (RXBUF_UCHAR(4));
// Indicates whether sufficient lighting has been detected: 0 = insufficient lighting detected, 1 = sufficient
// lighting detected / Gibt aus, ob eine ausreichende Beleuchtung erkannt worden ist: 0 = keine ausreichende
// Beleuchtung erkannt, 1 = ausreichende Beleuchtung erkannt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ABSCHALTGRUND_FERNLICHT", "STAT_FLA_ORTSCHAFTSERKENNUNG", STAT_FLA_ORTSCHAFTSERKENNUNG, "\"0/1\"");
unsigned char STAT_FLA_NEBELERKENNUNG = (RXBUF_UCHAR(5));
// Indicates whether fog has been detected: 0 = no fog, 1 = fog detected / Gibt aus, ob Nebel erkannt worden ist:
// 0 = kein Nebel, 1 = Nebel erkannt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ABSCHALTGRUND_FERNLICHT", "STAT_FLA_NEBELERKENNUNG", STAT_FLA_NEBELERKENNUNG, "\"0/1\"");
unsigned char STAT_FLA_AUTOBAHNMODE = (RXBUF_UCHAR(6));
// Indicates whether a motorway has been recognized: 0 = no motorway, 1 = motorway recognized / Gibt aus, ob
// Autobahn erkannt worden ist: 0 = keine Autobahn, 1 = Autobahn erkannt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ABSCHALTGRUND_FERNLICHT", "STAT_FLA_AUTOBAHNMODE", STAT_FLA_AUTOBAHNMODE, "\"0/1\"");
unsigned char STAT_FLA_VERZOEGERUNGSZEIT = (RXBUF_UCHAR(7));
// Indicates whether the high beam is not switched on due to a time delay: 0 = no time delay, 1 = time delay /
// Gibt aus, ob wegen einer Zeiterzögerung das Fernlicht nicht eingeschaltet wird: 0 = keine Zeitverzögerung, 1
// = Zeitverzögerung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ABSCHALTGRUND_FERNLICHT", "STAT_FLA_VERZOEGERUNGSZEIT", STAT_FLA_VERZOEGERUNGSZEIT, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_KONFIGURATION_KAFAS: { // 0xD374
if (datalen < 6) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_KONFIGURATION_KAFAS", 6);
break;
}
unsigned char STAT_VORHANDEN_TLC = (RXBUF_UCHAR(0));
// Indicates whether the time-to-line crossing function is available: 0 = not available; 1 = present / Gibt an,
// ob die Funktion Time-to-Line Crossing vorhanden ist: 0= nicht vorhanden; 1= vorhanden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "KONFIGURATION_KAFAS", "STAT_VORHANDEN_TLC", STAT_VORHANDEN_TLC, "\"0/1\"");
unsigned char STAT_VORHANDEN_FLA = (RXBUF_UCHAR(1));
// Indicates whether the high beam assistant function is available: 0 = not available; 1 = present / Gibt an, ob
// die Funktion Fernlichtassistent vorhanden ist: 0= nicht vorhanden; 1= vorhanden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "KONFIGURATION_KAFAS", "STAT_VORHANDEN_FLA", STAT_VORHANDEN_FLA, "\"0/1\"");
unsigned char STAT_VORHANDEN_SLI = (RXBUF_UCHAR(2));
// Indicates whether the Speed-Limit-Info function is available: 0 = not available; 1 = present / Gibt an, ob die
// Funktion Speed-Limit-Info vorhanden ist: 0= nicht vorhanden; 1= vorhanden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "KONFIGURATION_KAFAS", "STAT_VORHANDEN_SLI", STAT_VORHANDEN_SLI, "\"0/1\"");
unsigned char STAT_VORHANDEN_NPI = (RXBUF_UCHAR(3));
// Indicates whether the NoPassing-Info function is available: 0 = not available; 1 = present / Gibt an, ob die
// Funktion NoPassing-Info vorhanden ist: 0= nicht vorhanden; 1= vorhanden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "KONFIGURATION_KAFAS", "STAT_VORHANDEN_NPI", STAT_VORHANDEN_NPI, "\"0/1\"");
unsigned char STAT_VORHANDEN_FCW = (RXBUF_UCHAR(4));
// Indicates whether the Forward Collision Warning function is available: 0 = not available; 1 = present / Gibt
// an, ob die Funktion Forward-Collision-Warning vorhanden ist: 0= nicht vorhanden; 1= vorhanden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "KONFIGURATION_KAFAS", "STAT_VORHANDEN_FCW", STAT_VORHANDEN_FCW, "\"0/1\"");
unsigned char STAT_VORHANDEN_PED = (RXBUF_UCHAR(5));
// Indicates whether the Pedistrian Recognition function is available: 0 = not available; 1 = present / Gibt an,
// ob die Funktion Pedistrian Recognition (Fußgängererkennung) vorhanden ist: 0= nicht vorhanden; 1= vorhanden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "KONFIGURATION_KAFAS", "STAT_VORHANDEN_PED", STAT_VORHANDEN_PED, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_KAFAS_VINS_LESEN: { // 0xD393
if (datalen < 15) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_KAFAS_VINS_LESEN", 15);
break;
}
unsigned char STAT_KAFAS_VIN_STATUS_NR = (RXBUF_UCHAR(14));
// Indicates whether the assignment of camera to control unit matches: 0x00: NO MATCH, 0x01: MATCH / Gibt aus, ob
// die Zuordnung Kamera zu Steuergerät übereinstimmt: 0x00: KEINE UEBEREINSTIMMUNG, 0x01: UEBEREINSTIMMUNG
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "KAFAS_VINS_LESEN", "STAT_KAFAS_VIN_STATUS_NR", STAT_KAFAS_VIN_STATUS_NR, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_KALIBRIERDATEN_KAFAS: { // 0xD396
if (datalen < 25) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_KALIBRIERDATEN_KAFAS", 25);
break;
}
unsigned short STAT_OFFLINE_YAW_WERT = (RXBUF_UINT(0));
// Offline yaw angle / Offline Yaw-Winkel
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_OFFLINE_YAW_WERT", STAT_OFFLINE_YAW_WERT, "\"Pixel\"");
unsigned short STAT_OFFLINE_HORIZON_WERT = (RXBUF_UINT(2));
// Offline horizon angle / Offline Horizon-Winkel
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_OFFLINE_HORIZON_WERT", STAT_OFFLINE_HORIZON_WERT, "\"Pixel\"");
float STAT_OFFLINE_ROLL_WERT = (RXBUF_UINT(4)/100.0f);
// Offline roll angle / Offline Roll-Winkel
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_OFFLINE_ROLL_WERT", STAT_OFFLINE_ROLL_WERT, "\"Grad\"");
unsigned short STAT_ONLINE_YAW_WERT = (RXBUF_UINT(6));
// Online yaw angle / Online Yaw-Winkel
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_ONLINE_YAW_WERT", STAT_ONLINE_YAW_WERT, "\"Pixel\"");
unsigned short STAT_ONLINE_HORIZON_WERT = (RXBUF_UINT(8));
// Online horizon angle / Online Horizon-Winkel
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_ONLINE_HORIZON_WERT", STAT_ONLINE_HORIZON_WERT, "\"Pixel\"");
float STAT_ONLINE_ROLL_WERT = (RXBUF_UINT(10)/100.0f);
// Online roll angle / Online Roll-Winkel
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_ONLINE_ROLL_WERT", STAT_ONLINE_ROLL_WERT, "\"Grad\"");
unsigned short STAT_KAM_HOEHE_WERT = (RXBUF_UINT(12));
// Camera installation height / Kamera-Verbauhöhe
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_KAM_HOEHE_WERT", STAT_KAM_HOEHE_WERT, "\"mm\"");
unsigned short STAT_BRENNWEITE_WERT = (RXBUF_UINT(14));
// Focal length / Brennweite
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_BRENNWEITE_WERT", STAT_BRENNWEITE_WERT, "\"Pixel\"");
unsigned short STAT_GRABBING_SHIFT_WERT = (RXBUF_UINT(16));
// Grabbing shift / Grabbing-Shift
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "KALIBRIERDATEN_KAFAS", "STAT_GRABBING_SHIFT_WERT", STAT_GRABBING_SHIFT_WERT, "\"Pixel\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_KAMERAVERBINDUNG_ECU: { // 0xD397
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_KAMERAVERBINDUNG_ECU", 1);
break;
}
unsigned char STAT_KAFAS_VERBINDUNG_KAM_NR = (RXBUF_UCHAR(0));
// For values see TAB_KAM_VERBINDUNG / Werte siehe TAB_KAM_VERBINDUNG
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "KAMERAVERBINDUNG_ECU", "STAT_KAFAS_VERBINDUNG_KAM_NR", STAT_KAFAS_VERBINDUNG_KAM_NR, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_ERGEBNIS_SLI: { // 0xD3AA
if (datalen < 7) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_ERGEBNIS_SLI", 7);
break;
}
unsigned char STAT_KAMERA_ZEICHEN_NR = (RXBUF_UCHAR(0));
// Indicates which character was recognized by the camera: Results see TAB_ZEICHEN_KAMERA / Gibt aus, welches
// Zeichen von der Kamera erkannt wurde: Results siehe TAB_ZEICHEN_KAMERA
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ERGEBNIS_SLI", "STAT_KAMERA_ZEICHEN_NR", STAT_KAMERA_ZEICHEN_NR, "\"0-n\"");
unsigned char STAT_KAMERA_GESCHWINDIGKEIT_WERT = (RXBUF_UCHAR(1));
// Indicates the speed that was recognized in the characters: 0 = cancellation of everything, 5 to 150 in steps
// of 5. / Gibt aus, welche Geschwindigkeit in den Zeichen erkannt wurde: 0 = Aufhebung alles, 5 bis 150 in 5-er
// Schritten.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ERGEBNIS_SLI", "STAT_KAMERA_GESCHWINDIGKEIT_WERT", STAT_KAMERA_GESCHWINDIGKEIT_WERT, "");
unsigned char STAT_KARTE_ZEICHEN_NR = (RXBUF_UCHAR(2));
// Indicates which character was read from the card: For results see TAB_ZEICHEN_KARTE / Gibt aus, welches
// Zeichen aus der Karte gelesen wurde: Results siehe TAB_ZEICHEN_KARTE
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ERGEBNIS_SLI", "STAT_KARTE_ZEICHEN_NR", STAT_KARTE_ZEICHEN_NR, "\"0-n\"");
unsigned char STAT_KARTE_GESCHWINDIGKEIT_WERT = (RXBUF_UCHAR(3));
// Indicates the speed that was read from the card: 0 = cancel everything, 5 to 150 in steps of 5. / Gibt aus,
// welche Geschwindigkeit aus der Karte gelesen wurde: 0 = Aufhebung alles, 5 bis 150 in 5-er Schritten.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ERGEBNIS_SLI", "STAT_KARTE_GESCHWINDIGKEIT_WERT", STAT_KARTE_GESCHWINDIGKEIT_WERT, "");
unsigned char STAT_FUSIONIERT_ZEICHEN_NR = (RXBUF_UCHAR(4));
// Indicates which character is output from the merged recognition result: Results see TAB_ZEICHEN_FUSIONIERT /
// Gibt aus, welches Zeichen aus den fusioniertem Erkennungsergebnis ausgegeben wird: Results siehe
// TAB_ZEICHEN_FUSIONIERT
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ERGEBNIS_SLI", "STAT_FUSIONIERT_ZEICHEN_NR", STAT_FUSIONIERT_ZEICHEN_NR, "\"0-n\"");
unsigned char STAT_FUSIONIERT_GESCHWINDIGKEIT_WERT = (RXBUF_UCHAR(5));
// Outputs the speed from the merged recognition result: 0 = cancel everything, 5 to 150 in steps of 5 / Gibt
// aus, welche Geschwindigkeit aus dem fusionierten Erkennungsergebnis ausgegeben wird: 0 = Aufhebung alles, 5
// bis 150 in 5-er Schritten
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ERGEBNIS_SLI", "STAT_FUSIONIERT_GESCHWINDIGKEIT_WERT", STAT_FUSIONIERT_GESCHWINDIGKEIT_WERT, "");
unsigned char STAT_GUETE_KAM_SLI_GESCHW_WERT = (RXBUF_UCHAR(6));
// Indicates the quality with which the restriction and cancellation sign for speeds was recognized with the
// camera: 0 - 100 / Gibt aus, mit welcher Güte das Beschränkungs- und Aufhebungszeichen für Geschwindigkeiten
// mit der Kamera erkannt wurde: 0 - 100
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "ERGEBNIS_SLI", "STAT_GUETE_KAM_SLI_GESCHW_WERT", STAT_GUETE_KAM_SLI_GESCHW_WERT, "\"%\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF_SPANNUNG_KLEMME_15N_WERT: { // 0xDAD2
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF_SPANNUNG_KLEMME_15N_WERT", 2);
break;
}
float STAT_SPANNUNG_KLEMME_15N_WERT = (RXBUF_UINT(0)/10.0f);
// Voltage value on the control unit at terminal 15N (accurate to one decimal place) / Spannungswert am
// Steuergerät an Klemme 15N (auf eine Nachkommastelle genau)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KAF", "SPANNUNG_KLEMME_15N_WERT", "STAT_SPANNUNG_KLEMME_15N_WERT", STAT_SPANNUNG_KLEMME_15N_WERT, "\"V\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__DEBUG_AUSGABE: { // 0xF001
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__DEBUG_AUSGABE", 2);
break;
}
unsigned short STAT_DEBUG_AUSGABE = (RXBUF_UINT(0));
// Returns the status of whether the debug message output is active / Liefert den Status ob die Ausgabe der
// Debug-Nachrichten aktiv ist
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_DEBUG_AUSGABE", "STAT_DEBUG_AUSGABE", STAT_DEBUG_AUSGABE, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__PEDANTIC_MODE: { // 0xF003
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__PEDANTIC_MODE", 1);
break;
}
unsigned char STAT_PEDANTIC_MODE = (RXBUF_UCHAR(0));
// Activation status of Pedantic Mode for SLI and NPI / Aktivierungsstatus des Pedantic Mode für SLI und NPI
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KAF", "_PEDANTIC_MODE", "STAT_PEDANTIC_MODE", STAT_PEDANTIC_MODE, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KAF__ERASE_MICRO_CORE_DUMP: { // 0xF004
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KAF__ERASE_MICRO_CORE_DUMP", 2);
break;
}
unsigned short STAT_ERASE_RESULT = (RXBUF_UINT(0));
// Deletion result / Löschergebnis
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KAF", "_ERASE_MICRO_CORE_DUMP", "STAT_ERASE_RESULT", STAT_ERASE_RESULT, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}

View File

@ -1,944 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/kafas20.json: KAF 5D: Camera based driver assistance system
// This generated code makes it easier to process CANBUS messages from the KAF ecu in a BMW i3
//
#define I3_ECU_KAF_TX 0x06F15D
#define I3_ECU_KAF_RX 0x065DF1
// Skipping _BREMSENANSTEUERUNG_FCW on 0x4000 which takes arguments
#define I3_PID_KAF__FASTA_FLA_DATA 0x4001
// _FASTA_FLA_DATA / _FASTA_FLA_DATA
#define I3_RES_KAF_STAT_FLA_OP_TIME_WERT (RXBUF_UINT32(0))
#define I3_RES_KAF_STAT_FLA_OP_TIME_WERT_UNIT 's'
#define I3_RES_KAF_STAT_FLA_OP_TIME_WERT_TYPE unsigned long
// Duration of FLA activated by driver [s] / Zeitdauer FLA durch Fahrer aktiviert [s]
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_NIGHT_WERT (RXBUF_UINT32(4))
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_NIGHT_WERT_UNIT 's'
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_NIGHT_WERT_TYPE unsigned long
// Duration in the ambient brightness FLA activation allowed [s] / Zeitdauer in der Umgebungshelligkeit FLA
// Aktivierung erlaubt [s]
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_ACT_HB_WERT (RXBUF_UINT32(8))
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_ACT_HB_WERT_UNIT 's'
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_ACT_HB_WERT_TYPE unsigned long
// Duration of switch-on recommendation FLA [s] / Zeitdauer Einschaltempfehlung FLA [s]
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_ACT_LB_WERT (RXBUF_UINT32(12))
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_ACT_LB_WERT_UNIT 's'
#define I3_RES_KAF_STAT_DELTA_TIME_FLA_ACT_LB_WERT_TYPE unsigned long
// Duration of switch-off recommendation [s] / Zeitdauer Abschaltempfehlung [s]
#define I3_RES_KAF_STAT_FLA_COUNT_OVERRIDE_WERT (RXBUF_UINT32(16))
#define I3_RES_KAF_STAT_FLA_COUNT_OVERRIDE_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FLA_COUNT_OVERRIDE_WERT_TYPE unsigned long
// Number of driver overloads / Anzahl Übersteuerung durch Fahrer
#define I3_RES_KAF_STAT_OPTIME_TOTAL_WERT (RXBUF_UINT32(20))
#define I3_RES_KAF_STAT_OPTIME_TOTAL_WERT_UNIT 's'
#define I3_RES_KAF_STAT_OPTIME_TOTAL_WERT_TYPE unsigned long
// Absolute operating time counter [s] / Absoluter Betriebszeitzähler [s]
#define I3_PID_KAF__KAFAS_ECU_DATA 0x4002
// _KAFAS_ECU_DATA / _KAFAS_ECU_DATA
#define I3_RES_KAF_STAT_CNTRY_CODE_WERT (RXBUF_UINT(0))
#define I3_RES_KAF_STAT_CNTRY_CODE_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_CNTRY_CODE_WERT_TYPE unsigned short
// ISO Country Code of the country in which the vehicle covered the most kilometers. / ISO Country Code des
// Landes in welchem das Fahrzeug die meisten Kilometer zurückgelegt hat.
#define I3_RES_KAF_STAT_OPTIME_TOTAL_WERT_0X4002 (RXBUF_UINT32(2))
#define I3_RES_KAF_STAT_OPTIME_TOTAL_WERT_0X4002_UNIT 's'
#define I3_RES_KAF_STAT_OPTIME_TOTAL_WERT_0X4002_TYPE unsigned long
// Absolute operating time counter / Absoluter Betriebszeitzähler
#define I3_RES_KAF_STAT_OPTIME_NIGHT_WERT (RXBUF_UINT32(6))
#define I3_RES_KAF_STAT_OPTIME_NIGHT_WERT_UNIT 's'
#define I3_RES_KAF_STAT_OPTIME_NIGHT_WERT_TYPE unsigned long
// Operating time at night. Based on BV-Algo overnight decision / Betriebszeit in der Nacht. Basiert auf BV-Algo
// Nachtentscheidung
#define I3_RES_KAF_STAT_OPTIME_WIPER_WERT (RXBUF_UINT32(10))
#define I3_RES_KAF_STAT_OPTIME_WIPER_WERT_UNIT 's'
#define I3_RES_KAF_STAT_OPTIME_WIPER_WERT_TYPE unsigned long
// Operating time during rain. Based on Algo Rain Decision / Betriebszeit während Regen. Basiert auf Algo
// Regenentscheidung
#define I3_RES_KAF_STAT_DRIVEN_DIST_TOTAL_WERT (RXBUF_UINT32(14))
#define I3_RES_KAF_STAT_DRIVEN_DIST_TOTAL_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_DRIVEN_DIST_TOTAL_WERT_TYPE unsigned long
// Absolutely driven kilometers / Absolut gefahrene Kilometer
#define I3_RES_KAF_STAT_DRIVEN_DIST_URBAN_WERT (RXBUF_UINT32(18))
#define I3_RES_KAF_STAT_DRIVEN_DIST_URBAN_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_DRIVEN_DIST_URBAN_WERT_TYPE unsigned long
// Total kilometers driven on urban or residential area roads / Absolut gefahrene Kilometer auf Straßentyp Urban
// oder Residential Area
#define I3_RES_KAF_STAT_DRIVEN_DIST_RURAL_WERT (RXBUF_UINT32(22))
#define I3_RES_KAF_STAT_DRIVEN_DIST_RURAL_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_DRIVEN_DIST_RURAL_WERT_TYPE unsigned long
// Absolute kilometers driven on the rural or highway type / Absolut gefahrene Kilometer auf Straßentyp Rural
// oder Highway
#define I3_RES_KAF_STAT_DRIVEN_DIST_MOWAY_WERT (RXBUF_UINT32(26))
#define I3_RES_KAF_STAT_DRIVEN_DIST_MOWAY_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_DRIVEN_DIST_MOWAY_WERT_TYPE unsigned long
// Absolute kilometers driven on road type Motorway / Absolut gefahrene Kilometer auf Straßentyp Motorway
#define I3_RES_KAF_STAT_DRIVEN_DIST_NA_WERT (RXBUF_UINT32(30))
#define I3_RES_KAF_STAT_DRIVEN_DIST_NA_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_DRIVEN_DIST_NA_WERT_TYPE unsigned long
// Absolute kilometers driven with no available road type / Absolut gefahrene Kilometer ohne verfügbaren
// Straßentyp
#define I3_RES_KAF_STAT_AMNT_EYEQ_RESET_WERT (RXBUF_UINT(34))
#define I3_RES_KAF_STAT_AMNT_EYEQ_RESET_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_AMNT_EYEQ_RESET_WERT_TYPE unsigned short
// Number of resets of the BV processor performed during normal operation / Anzahl der erfolgten Resets des
// BV-Prozessors während normalem Betrieb
#define I3_RES_KAF_STAT_AMNT_ONLINE_CALIB_WERT (RXBUF_UINT(36))
#define I3_RES_KAF_STAT_AMNT_ONLINE_CALIB_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_AMNT_ONLINE_CALIB_WERT_TYPE unsigned short
// Counter for the completed online calibration processes / Zähler über die Erfolgten Online-Kalibriervorgänge
#define I3_PID_KAF__KAFAS_TLC_DATA 0x4003
// _KAFAS_TLC_DATA / _KAFAS_TLC_DATA
#define I3_RES_KAF_STAT_TLC_DRIV_LEFT_AVAIL_WERT (RXBUF_UINT32(0))
#define I3_RES_KAF_STAT_TLC_DRIV_LEFT_AVAIL_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_TLC_DRIV_LEFT_AVAIL_WERT_TYPE unsigned long
// Absolute kilometers driven with availability on the left / Absolut gefahrene Kilometer mit Verfübarkeit auf
// der linken Seite
#define I3_RES_KAF_STAT_TLC_DRIV_RIGHT_AVAIL_WERT (RXBUF_UINT32(4))
#define I3_RES_KAF_STAT_TLC_DRIV_RIGHT_AVAIL_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_TLC_DRIV_RIGHT_AVAIL_WERT_TYPE unsigned long
// Absolute kilometers driven with availability on the right / Absolut gefahrene Kilometer mit Verfübarkeit auf
// der rechten Seite
#define I3_RES_KAF_STAT_TLC_DRIV_DIST_REL_SPD_WERT (RXBUF_UINT32(8))
#define I3_RES_KAF_STAT_TLC_DRIV_DIST_REL_SPD_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_TLC_DRIV_DIST_REL_SPD_WERT_TYPE unsigned long
// Absolutely driven with active TLC and relevant speed / Absolut gefahrene mit aktivem TLC und relavanter
// Geschwindigkeit
#define I3_RES_KAF_STAT_TLC_AMNT_WARN_WERT (RXBUF_UINT(12))
#define I3_RES_KAF_STAT_TLC_AMNT_WARN_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_TLC_AMNT_WARN_WERT_TYPE unsigned short
// Number of issued TLC warnings / Anzahl ausgegebener TLC Warnungen
#define I3_RES_KAF_STAT_TLC_AMNT_DEACT_WERT (RXBUF_UINT(14))
#define I3_RES_KAF_STAT_TLC_AMNT_DEACT_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_TLC_AMNT_DEACT_WERT_TYPE unsigned short
// Number of times the TLC function was deactivated by the driver / Anzahl der Deaktivierung der TLC-Funktion
// durch den Fahrer
#define I3_RES_KAF_STAT_TLC_DRIV_DIST_ACT_WERT (RXBUF_UINT32(16))
#define I3_RES_KAF_STAT_TLC_DRIV_DIST_ACT_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_TLC_DRIV_DIST_ACT_WERT_TYPE unsigned long
// Kilometers driven with activated TLC / Gefahrene Kilometer mit aktiviertem TLC
#define I3_PID_KAF_KAFAS_FCW_DATA 0x4004
// KAFAS_FCW_DATA / KAFAS_FCW_DATA
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_ACT_WERT (RXBUF_UINT32(0))
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_ACT_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_ACT_WERT_TYPE unsigned long
// Total kilometers driven with activated FCW function / Absolut gefahrene Kilometer mit aktivierter FCW Funktion
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FS_WERT (RXBUF_UINT32(4))
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FS_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FS_WERT_TYPE unsigned long
// Total kilometers driven in fail safe mode / Absolut gefahrene Kilometer im Fail Safe Mode
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FS_ACT_WERT (RXBUF_UINT32(8))
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FS_ACT_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FS_ACT_WERT_TYPE unsigned long
// Total kilometers driven with activated FCW function in fail safe mode / Absolut gefahrene Kilometer mit
// aktivierter FCW Funktion im Fail Safe Mode
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_OFF_WERT (RXBUF_UINT32(12))
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_OFF_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_OFF_WERT_TYPE unsigned long
// Absolutely driven kilometers with activated FCW function and advance warning level off / Absolut gefahrene
// Kilometer mit aktivierter FCW Funktion und Vorwarnstufe aus
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_EARLY_WERT (RXBUF_UINT32(16))
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_EARLY_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_EARLY_WERT_TYPE unsigned long
// Total kilometers traveled with activated FCW function and early warning level / Absolut gefahrene Kilometer
// mit aktivierter FCW Funktion und Vorwarnstufe früh
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_LATE_WERT (RXBUF_UINT32(20))
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_LATE_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_FCW_DRIVEN_DIST_FOR_LATE_WERT_TYPE unsigned long
// Total kilometers driven with activated FCW function and late warning level / Absolut gefahrene Kilometer mit
// aktivierter FCW Funktion und Vorwarnstufe spät
#define I3_RES_KAF_STAT_FCW_AMNT_FOR_WERT (RXBUF_UINT(24))
#define I3_RES_KAF_STAT_FCW_AMNT_FOR_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_AMNT_FOR_WERT_TYPE unsigned short
// Number of pre-warnings / Anzahl der Vorwarnungen
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_WERT (RXBUF_UINT(26))
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_WERT_TYPE unsigned short
// Number of acute warnings / Anzahl der Akutwarnungen
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_45_WERT (RXBUF_UINT(28))
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_45_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_45_WERT_TYPE unsigned short
// Number of acute warnings in the range 0 km / h¿ 45 km / h / Anzahl der Akutwarnungen im Bereich 0 km/h¿ 45
// km/h
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_90_WERT (RXBUF_UINT(30))
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_90_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_90_WERT_TYPE unsigned short
// Number of acute warnings in the range 45 km / h¿ 90 km / h / Anzahl der Akutwarnungen im Bereich 45 km/h¿ 90
// km/h
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_135_WERT (RXBUF_UINT(32))
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_135_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_AMNT_ACUTE_135_WERT_TYPE unsigned short
// Number of acute warnings in the range 90 km / h¿ 135 km / h / Anzahl der Akutwarnungen im Bereich 90 km/h¿ 135
// km/h
#define I3_RES_KAF_STAT_FCW_PREFILLS_WERT (RXBUF_UINT(34))
#define I3_RES_KAF_STAT_FCW_PREFILLS_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_PREFILLS_WERT_TYPE unsigned short
// Number of pre-fill requests triggered by FCW / Anzahl der von FCW ausgelösten Pre-Fill Anforderungen
#define I3_RES_KAF_STAT_FCW_PRECRASH_WERT (RXBUF_UINT(36))
#define I3_RES_KAF_STAT_FCW_PRECRASH_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_PRECRASH_WERT_TYPE unsigned short
// Number of pre-crash messages triggered by FCW / Anzahl der von FCW ausgelösten Pre-Crash Meldungen
#define I3_RES_KAF_STAT_FCW_DEACT_WERT (RXBUF_UINT(38))
#define I3_RES_KAF_STAT_FCW_DEACT_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_DEACT_WERT_TYPE unsigned short
// Number of times the FCW function has been deactivated by the driver / Anzahl der Deaktivierung der
// FCW-Funktion durch den Fahrer
#define I3_RES_KAF_STAT_FCW_FS_CC_WERT (RXBUF_UINT(40))
#define I3_RES_KAF_STAT_FCW_FS_CC_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FCW_FS_CC_WERT_TYPE unsigned short
// Number of triggered Fail-Save CC messages / Anzahl der ausgelösten Fail-Save CC-Meldungen
#define I3_PID_KAF__KAFAS_SLI_DATA 0x4005
// _KAFAS_SLI_DATA / _KAFAS_SLI_DATA
#define I3_RES_KAF_STAT_SLI_AMT_CAM_DET_WERT (RXBUF_UINT32(0))
#define I3_RES_KAF_STAT_SLI_AMT_CAM_DET_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_SLI_AMT_CAM_DET_WERT_TYPE unsigned long
// Number of camera detections of traffic signs / Anzahl der Kameradetektionen von Verkehrsschildern
#define I3_RES_KAF_STAT_SLI_MATCH_URBAN_WERT (RXBUF_UCHAR(4))
#define I3_RES_KAF_STAT_SLI_MATCH_URBAN_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_SLI_MATCH_URBAN_WERT_TYPE char
// Share of camera detection that match the explicit speed limits on the street type Urban or Residential Area /
// Anteil der Kameradetektion die mit den expliziten Speed Limits auf dem Straßentyp Urban oder Residential Area
// übereinstimmen
#define I3_RES_KAF_STAT_SLI_MATCH_RURAL_WERT (RXBUF_UCHAR(5))
#define I3_RES_KAF_STAT_SLI_MATCH_RURAL_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_SLI_MATCH_RURAL_WERT_TYPE char
// Proportion of camera detection that corresponds to the explicit speed limits on the road type rural or highway
// / Anteil der Kameradetektion die mit den expliziten Speed Limits auf dem Straßentyp Rural oder Highway
// übereinstimmen
#define I3_RES_KAF_STAT_SLI_MATCH_MOWAY_WERT (RXBUF_UCHAR(6))
#define I3_RES_KAF_STAT_SLI_MATCH_MOWAY_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_SLI_MATCH_MOWAY_WERT_TYPE char
// Percentage of camera detection that corresponds to the explicit speed limits on the road type Motorway /
// Anteil der Kameradetektion die mit den expliziten Speed Limits auf dem Straßentyp Motorway übereinstimmen
#define I3_RES_KAF_STAT_SLI_REP_URBAN_WERT (RXBUF_UINT(7))
#define I3_RES_KAF_STAT_SLI_REP_URBAN_WERT_UNIT 'm'
#define I3_RES_KAF_STAT_SLI_REP_URBAN_WERT_TYPE unsigned short
// Average distance at which signs repeat on the street type Urban or Residential Area / Durschnittlich Enfernung
// in welcher sich Schilder auf dem Straßentyp Urbanoder Residential Area wiederholen
#define I3_RES_KAF_STAT_SLI_REP_RURAL_WERT (RXBUF_UINT(9))
#define I3_RES_KAF_STAT_SLI_REP_RURAL_WERT_UNIT 'm'
#define I3_RES_KAF_STAT_SLI_REP_RURAL_WERT_TYPE unsigned short
// Average distance at which signs repeat on the road type rural or highway / Durschnittlich Enfernung in welcher
// sich Schilder auf dem Straßentyp Rural oder Highway wiederholen
#define I3_RES_KAF_STAT_SLI_REP_MOWAY_WERT (RXBUF_UINT(11))
#define I3_RES_KAF_STAT_SLI_REP_MOWAY_WERT_UNIT 'm'
#define I3_RES_KAF_STAT_SLI_REP_MOWAY_WERT_TYPE unsigned short
// Average distance at which signs repeat on the road type Motorway / Durschnittlich Enfernung in welcher sich
// Schilder auf dem Straßentyp Motorway wiederholen
#define I3_RES_KAF_STAT_SLI_OVER_SLI_WERT (RXBUF_UINT32(13))
#define I3_RES_KAF_STAT_SLI_OVER_SLI_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_SLI_OVER_SLI_WERT_TYPE unsigned long
// Distance driven at least 20 km / h above the detected speed limit / Gefahrene Entfernung mit mindestens 20
// km/h über dem erkannten Speed Limit
#define I3_RES_KAF_STAT_SLI_SSS_TIME_WERT (RXBUF_UINT(17))
#define I3_RES_KAF_STAT_SLI_SSS_TIME_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_SLI_SSS_TIME_WERT_TYPE unsigned short
// Number of recognized additional characters with time restriction / Anzahl der erkannten Zusatzzeichen mit
// Zeitbeschränkung
#define I3_RES_KAF_STAT_SLI_NPI_WERT (RXBUF_UINT32(19))
#define I3_RES_KAF_STAT_SLI_NPI_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_SLI_NPI_WERT_TYPE unsigned long
// Kilometers driven with no overtaking recognized / Gefahrene Kilometer mit erkanntem Überholverbot
#define I3_RES_KAF_STAT_SLI_NP_WITHDRAW_DIST_WERT (RXBUF_UINT(23))
#define I3_RES_KAF_STAT_SLI_NP_WITHDRAW_DIST_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_SLI_NP_WITHDRAW_DIST_WERT_TYPE unsigned short
// Number of cancellations of overtaking ban due to exceeding the stopping distance / Anzahl Aufhebungen
// Überholverbot infolge Überschreitung Haltedistanz
#define I3_RES_KAF_STAT_SLI_NP_WITHDRAW_SIGN_WERT (RXBUF_UINT(25))
#define I3_RES_KAF_STAT_SLI_NP_WITHDRAW_SIGN_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_SLI_NP_WITHDRAW_SIGN_WERT_TYPE unsigned short
// Number of cancellations No overtaking due to detection of a lifting sign / Anzahl Aufhebungen Überholverbot
// infolge Detektion Aufhebungsschild
// Skipping _FASTA_FLA_LOESCHEN on 0x4006 which takes arguments
// Skipping _STEURUNG_KALIBRIERDATEN_KAFAS on 0x400A which takes arguments
// Skipping _STEUERN_SLI_NPI_KAMERA_ERKENNUNG on 0x400B which takes arguments
// Skipping _STEURUNG_SHUTDOWN_WATCHDOG on 0x400C which takes arguments
#define I3_PID_KAF__STATUS_SAFETY_DIAG_INFO 0x400E
// This job shall respond with information about the errors detected by the Safety Diagnostic Manager. The
// parameter values shall indicate 0 for fault_not_present and 1 for fault_present. / This job shall respond with
// information about the errors detected by the Safety Diagnostic Manager. The parameter values shall indicate 0
// for fault_not_present and 1 for fault_present.
#define I3_RES_KAF_STAT_BYTE_0_FAULT_WERT (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_BYTE_0_FAULT_WERT_UNIT 'HEX'
#define I3_RES_KAF_STAT_BYTE_0_FAULT_WERT_TYPE unsigned char
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0
// UP1V0D_freeze_fault 1 UP1V8D_freeze_fault 2 UP2V5D_freeze_fault 3 UP3V3D_freeze_fault 4 UP5V0D_freeze_fault 5
// VTEMP1_freeze_fault 6 VTEMP2_freeze_fault 7 V_BAT1_freeze_fault / The parameter values shall indicate 0 for
// fault_not_present and 1 for fault_present. Bit: 0 UP1V0D_freeze_fault 1 UP1V8D_freeze_fault 2
// UP2V5D_freeze_fault 3 UP3V3D_freeze_fault 4 UP5V0D_freeze_fault 5 VTEMP1_freeze_fault 6 VTEMP2_freeze_fault 7
// V_BAT1_freeze_fault
#define I3_RES_KAF_STAT_BYTE_1_FAULT_WERT (RXBUF_UCHAR(1))
#define I3_RES_KAF_STAT_BYTE_1_FAULT_WERT_UNIT 'HEX'
#define I3_RES_KAF_STAT_BYTE_1_FAULT_WERT_TYPE unsigned char
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0
// UP1V0D_freeze_fault 1 UP1V8D_freeze_fault 2 UP2V5D_freeze_fault 3 UP3V3D_freeze_fault 4 UP5V0D_freeze_fault 5
// VTEMP1_freeze_fault 6 VTEMP2_freeze_fault 7 V_BAT1_freeze_fault / The parameter values shall indicate 0 for
// fault_not_present and 1 for fault_present. Bit: 0 UP1V0D_freeze_fault 1 UP1V8D_freeze_fault 2
// UP2V5D_freeze_fault 3 UP3V3D_freeze_fault 4 UP5V0D_freeze_fault 5 VTEMP1_freeze_fault 6 VTEMP2_freeze_fault 7
// V_BAT1_freeze_fault
#define I3_RES_KAF_STAT_BYTE_2_FAULT_WERT (RXBUF_UCHAR(2))
#define I3_RES_KAF_STAT_BYTE_2_FAULT_WERT_UNIT 'HEX'
#define I3_RES_KAF_STAT_BYTE_2_FAULT_WERT_TYPE unsigned char
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0
// UP1V0D_voltage_fault 1 UP1V8D_voltage_fault 2 UP2V5D_voltage_fault 3 UP3V3D_voltage_fault 4
// UP5V0D_voltage_fault 5 VTEMP1_temperature_fault 6 VTEMP2_temperature_fault 7 V_BAT1_voltage_fault / The
// parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 UP1V0D_voltage_fault
// 1 UP1V8D_voltage_fault 2 UP2V5D_voltage_fault 3 UP3V3D_voltage_fault 4 UP5V0D_voltage_fault 5
// VTEMP1_temperature_fault 6 VTEMP2_temperature_fault 7 V_BAT1_voltage_fault
#define I3_RES_KAF_STAT_BYTE_3_FAULT_WERT (RXBUF_UCHAR(3))
#define I3_RES_KAF_STAT_BYTE_3_FAULT_WERT_UNIT 'HEX'
#define I3_RES_KAF_STAT_BYTE_3_FAULT_WERT_TYPE unsigned char
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0
// ECU_inconsistent_temperature_fault / The parameter values shall indicate 0 for fault_not_present and 1 for
// fault_present. Bit: 0 ECU_inconsistent_temperature_fault
#define I3_RES_KAF_STAT_BYTE_4_FAULT_WERT (RXBUF_UCHAR(4))
#define I3_RES_KAF_STAT_BYTE_4_FAULT_WERT_UNIT 'HEX'
#define I3_RES_KAF_STAT_BYTE_4_FAULT_WERT_TYPE unsigned char
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 Eq2Unavailable 1
// Eq2FaultHandlingAliveError 2 Eq2FaultHandlingCrcError 3 VideoError_400 4 TempStatus_400 5 CamLVDS_Defect_400 6
// CamEEP_Fail_400 7 BurntPixel_400 / The parameter values shall indicate 0 for fault_not_present and 1 for
// fault_present. Bit: 0 Eq2Unavailable 1 Eq2FaultHandlingAliveError 2 Eq2FaultHandlingCrcError 3 VideoError_400
// 4 TempStatus_400 5 CamLVDS_Defect_400 6 CamEEP_Fail_400 7 BurntPixel_400
#define I3_RES_KAF_STAT_BYTE_5_FAULT_WERT (RXBUF_UCHAR(5))
#define I3_RES_KAF_STAT_BYTE_5_FAULT_WERT_UNIT 'HEX'
#define I3_RES_KAF_STAT_BYTE_5_FAULT_WERT_TYPE unsigned char
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 DDR_Failure_400 1
// WdgMSafetyAliveSupervisonFault / The parameter values shall indicate 0 for fault_not_present and 1 for
// fault_present. Bit: 0 DDR_Failure_400 1 WdgMSafetyAliveSupervisonFault
#define I3_RES_KAF_STAT_BYTE_6_FAULT_WERT (RXBUF_UCHAR(6))
#define I3_RES_KAF_STAT_BYTE_6_FAULT_WERT_UNIT 'HEX'
#define I3_RES_KAF_STAT_BYTE_6_FAULT_WERT_TYPE unsigned char
// The parameter values shall indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 ActiveFaultClass
// Bit 0 * 1 ActiveFaultClass Bit 1 * 2 ActiveFaultClass Bit 2 * 3 (not disp_drasy_available) 4 (not
// aAssistFunctionAvailable) 5 (not qAssistActive) 6 Not in use 7 Safe state entered disp_drasy_available means
// that the bit is 0 when the signal is available, and 1 when it is not available / The parameter values shall
// indicate 0 for fault_not_present and 1 for fault_present. Bit: 0 ActiveFaultClass Bit 0* 1 ActiveFaultClass
// Bit 1* 2 ActiveFaultClass Bit 2* 3 (not disp_drasy_available) 4 (not aAssistFunctionAvailable) 5 (not
// qAssistActive) 6 Not in use 7 Safe state entered disp_drasy_available means that the bit is 0 when the
// signal is availablem, and 1 when it is not available
#define I3_PID_KAF__STATUS_WARNZEITPUNKT_FCW 0x400F
// currently selected warning flavor / currently selected warning flavor
#define I3_RES_KAF_STAT_WARN_FLAV_FCW (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_WARN_FLAV_FCW_UNIT '0-n'
#define I3_RES_KAF_STAT_WARN_FLAV_FCW_TYPE unsigned char
// currently selected warning flavor / currently selected warning flavor
#define I3_PID_KAF_FASTA_PPP_DATA 0x4010
// FASTA_PPP_DATA / FASTA_PPP_DATA
#define I3_RES_KAF_STAT_PPP_WARNING_ZONE (RXBUF_UINT(0))
#define I3_RES_KAF_STAT_PPP_WARNING_ZONE_UNIT '0-n'
#define I3_RES_KAF_STAT_PPP_WARNING_ZONE_TYPE unsigned short
// Type of warning zone / Art der Warnzone
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_0_TO_20_WERT (RXBUF_UINT(2))
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_0_TO_20_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_0_TO_20_WERT_TYPE unsigned short
// The parameter is determined by counting the number of DZ events in the range 0 <x <20 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der DZ-Events im Bereich 0 < x < 20 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_20_TO_40_WERT (RXBUF_UINT(4))
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_20_TO_40_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_20_TO_40_WERT_TYPE unsigned short
// The parameter is determined by counting the number of DZ events in the range 20 <x <40 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der DZ-Events im Bereich 20 < x < 40 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_40_TO_60_WERT (RXBUF_UINT(6))
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_40_TO_60_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_DZ_EVENTS_40_TO_60_WERT_TYPE unsigned short
// The parameter is determined by counting the number of DZ events in the range 40 <x <60 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der DZ-Events im Bereich 40 < x < 60 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_0_TO_20_WERT (RXBUF_UINT(8))
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_0_TO_20_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_0_TO_20_WERT_TYPE unsigned short
// The parameter is determined by counting the number of PDZ1 events in the range 0 <x <20 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der PDZ1-Events im Bereich 0 < x < 20 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_20_TO_40_WERT (RXBUF_UINT(10))
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_20_TO_40_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_20_TO_40_WERT_TYPE unsigned short
// The parameter is determined by counting the number of PDZ1 events in the range 20 <x <40 km / h / Die
// Kenngröße wird bestimmt, indem die Anzahl der PDZ1-Events im Bereich 20 < x < 40 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_40_TO_60_WERT (RXBUF_UINT(12))
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_40_TO_60_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ1_EVENTS_40_TO_60_WERT_TYPE unsigned short
// The parameter is determined by counting the number of PDZ1 events in the range 40 <x <60 km / h / Die
// Kenngröße wird bestimmt, indem die Anzahl der PDZ1-Events im Bereich 40 < x < 60 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_0_TO_20_WERT (RXBUF_UINT(14))
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_0_TO_20_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_0_TO_20_WERT_TYPE unsigned short
// The parameter is determined by counting the number of PDZ2 events in the range 0 <x <20 km / h / Die Kenngröße
// wird bestimmt, indem die Anzahl der PDZ2-Events im Bereich 0 < x < 20 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_20_TO_40_WERT (RXBUF_UINT(16))
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_20_TO_40_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_20_TO_40_WERT_TYPE unsigned short
// The parameter is determined by counting the number of PDZ2 events in the range 20 <x <40 km / h / Die
// Kenngröße wird bestimmt, indem die Anzahl der PDZ2-Events im Bereich 20 < x < 40 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_40_TO_60_WERT (RXBUF_UINT(18))
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_40_TO_60_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_PDZ2_EVENTS_40_TO_60_WERT_TYPE unsigned short
// The parameter is determined by counting the number of PDZ2 events in the range 40 <x <60 km / h / Die
// Kenngröße wird bestimmt, indem die Anzahl der PDZ2-Events im Bereich 40 < x < 60 km/h gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_PREWARNUNG_REQUESTS_WERT (RXBUF_UINT(20))
#define I3_RES_KAF_STAT_PPP_AMNT_PREWARNUNG_REQUESTS_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_PREWARNUNG_REQUESTS_WERT_TYPE unsigned short
// The parameter is determined by counting the number of pre-warning requests / Die Kenngröße wird bestimmt,
// indem die Anzahl der Pre-Warning-Requests gezählt wird
#define I3_RES_KAF_STAT_PPP_AMNT_ACUTEWARNING_REQUESTS_WERT (RXBUF_UINT(22))
#define I3_RES_KAF_STAT_PPP_AMNT_ACUTEWARNING_REQUESTS_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_ACUTEWARNING_REQUESTS_WERT_TYPE unsigned short
// The parameter is determined by counting the number of acute warning requests. / Die Kenngröße wird bestimmt,
// indem die Anzahl der Acute-Warning-Requests gezählt wird.
#define I3_RES_KAF_STAT_PPP_AMNT_HBA_REQUESTS_WERT (RXBUF_UINT(24))
#define I3_RES_KAF_STAT_PPP_AMNT_HBA_REQUESTS_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_HBA_REQUESTS_WERT_TYPE unsigned short
// The parameter is determined by counting the number of HBA requests. / Die Kenngröße wird bestimmt, indem die
// Anzahl der HBA-Requests gezählt wird.
#define I3_RES_KAF_STAT_PPP_AMNT_PREFILL_REQUESTS_WERT (RXBUF_UINT(26))
#define I3_RES_KAF_STAT_PPP_AMNT_PREFILL_REQUESTS_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_PREFILL_REQUESTS_WERT_TYPE unsigned short
// The parameter is determined by counting the number of prefill requests. / Die Kenngröße wird bestimmt, indem
// die Anzahl der Prefill-Requests gezählt wird.
#define I3_RES_KAF_STAT_PPP_AMNT_BRAKE_REQUESTS_WERT (RXBUF_UINT(28))
#define I3_RES_KAF_STAT_PPP_AMNT_BRAKE_REQUESTS_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_AMNT_BRAKE_REQUESTS_WERT_TYPE unsigned short
// The parameter is determined by counting the number of brake requests. / Die Kenngröße wird bestimmt, indem die
// Anzahl der Brake-Requests gezählt wird.
#define I3_RES_KAF_STAT_PPP_DEACT_DRIVER_WERT (RXBUF_UINT(30))
#define I3_RES_KAF_STAT_PPP_DEACT_DRIVER_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_DEACT_DRIVER_WERT_TYPE unsigned short
// The parameter is determined by counting the number of times the pFGS function was switched off by the driver.
// (Status change of the activation by pressing the button) / Die Kenngröße wird bestimmt, indem die Anzahl der
// Abschaltungen der Funktion pFGS durch den Fahrer gezählt wird. (Statuswechsel der Aktivierung durch
// Tasterbetätigung)
#define I3_RES_KAF_STAT_PPP_DEACT_AVAILABILITY_WERT (RXBUF_UINT(32))
#define I3_RES_KAF_STAT_PPP_DEACT_AVAILABILITY_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_DEACT_AVAILABILITY_WERT_TYPE unsigned short
// The parameter is determined by counting the number of times the pFGS function was switched off by the KAFAS
// system based on the availability concept (e.g. recognition qualifier, degradation concept, ...). / Die
// Kenngröße wird bestimmt, indem die Anzahl der Abschaltungen der Funktion pFGS durch das KAFAS System aufgrund
// des Verfügbarkeitskonzeptes (z.B. Erkennungsqualifier, Degradationskonzept,...) gezählt wird.
#define I3_RES_KAF_STAT_PPP_DEACT_WARNING_CHAIN_WERT (RXBUF_UINT(34))
#define I3_RES_KAF_STAT_PPP_DEACT_WARNING_CHAIN_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_DEACT_WARNING_CHAIN_WERT_TYPE unsigned short
// The parameter is determined by counting the number of times the pPP function has been switched off by the
// KAFAS system based on the braking and warning chain. / Die Kenngröße wird bestimmt, indem die Anzahl der
// Abschaltungen der Funktion pPP durch das KAFAS System aufgrund der Brems-und Warnkette gezählt wird.
#define I3_RES_KAF_STAT_PPP_OPERATION_TIME_CL50_WERT (RXBUF_UINT32(36))
#define I3_RES_KAF_STAT_PPP_OPERATION_TIME_CL50_WERT_UNIT 's'
#define I3_RES_KAF_STAT_PPP_OPERATION_TIME_CL50_WERT_TYPE unsigned long
// The parameter is determined by always counting the operating time in seconds from terminal 50. / Die Kenngröße
// wird bestimmt, indem immer ab Kl 50 die Betriebszeit in Sekunden gezählt wird.
#define I3_RES_KAF_STAT_PPP_OPERATION_TIME_ACTIVE_WERT (RXBUF_UINT32(40))
#define I3_RES_KAF_STAT_PPP_OPERATION_TIME_ACTIVE_WERT_UNIT 's'
#define I3_RES_KAF_STAT_PPP_OPERATION_TIME_ACTIVE_WERT_TYPE unsigned long
// The parameter is determined by always counting the operating time in seconds from terminal 50 while the pFGS
// function is activated. / Die Kenngröße wird bestimmt, indem immer ab Kl 50 die Betriebszeit in Sekunden
// gezählt wird, während die pFGS-Funktion aktiviert ist.
#define I3_RES_KAF_STAT_PPP_FS_CC_WERT (RXBUF_UINT(44))
#define I3_RES_KAF_STAT_PPP_FS_CC_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_PPP_FS_CC_WERT_TYPE unsigned short
// The parameter is determined by counting the number of Check Control messages triggered due to reduced
// visibility for the pFGS function. / Die Kenngröße wird bestimmt, indem die Anzahl der ausgelösten Check
// Control Meldungen aufgrund reduzierter Sicht für die Funktion pFGS gezählt wird.
#define I3_RES_KAF_STAT_PPP_DRIVEN_TIME_FS_ACT_WERT (RXBUF_UINT32(46))
#define I3_RES_KAF_STAT_PPP_DRIVEN_TIME_FS_ACT_WERT_UNIT 's'
#define I3_RES_KAF_STAT_PPP_DRIVEN_TIME_FS_ACT_WERT_TYPE unsigned long
// The parameter is determined by determining the operating time from Kl 50 in seconds in which pFGS is in the
// reduced visibility status and activated by the driver. / Die Kenngröße wird bestimmt, indem die Betriebszeit
// ab Kl 50 in Sekunden ermittelt wird, in der pFGS im Status reduzierte Sicht und vom Fahrer aktiviert ist.
#define I3_PID_KAF_FASTA_CCM_DATA 0x4011
// FASTA_CCM_DATA / FASTA_CCM_DATA
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_20_WERT (RXBUF_UINT(0))
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_20_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_20_WERT_TYPE unsigned short
// The parameter is determined by counting the number of CCM brakes in which the speed of the host vehicle at the
// start of braking is greater than or equal to 0 km / h and less than 20 km / h. / Die Kenngröße wird bestimmt,
// indem die Anzahl der CCM-Bremsungen gezählt wird, bei denen die Geschwindigkeit des Egofahrzeugs zu
// Bremsbeginn größer gleich 0 km/h und kleiner 20 km/h ist.
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_40_WERT (RXBUF_UINT(2))
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_40_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_40_WERT_TYPE unsigned short
// The parameter is determined by counting the number of CCM brakes in which the speed of the host vehicle at the
// start of braking is greater than or equal to 20 km / h and less than 40 km / h. / Die Kenngröße wird bestimmt,
// indem die Anzahl der CCM-Bremsungen gezählt wird, bei denen die Geschwindigkeit des Egofahrzeugs zu
// Bremsbeginn größer gleich 20 km/h und kleiner 40 km/h ist.
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_GEQ40_WERT (RXBUF_UINT(4))
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_GEQ40_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_CCM_AMNT_BRAKE_GEQ40_WERT_TYPE unsigned short
// The parameter is determined by counting the number of CCM brakes in which the speed of the host vehicle is
// greater than or equal to 40 km / h at the beginning of the braking / Die Kenngröße wird bestimmt, indem die
// Anzahl der CCM-Bremsungen gezählt wird, bei denen die Geschwindigkeit des Egofahrzeugs zu Bremsbeginn größer
// gleich 40 km/h ist
#define I3_PID_KAF__KAFAS_ENVINT_DATA 0x4012
// _KAFAS_ENVINT_DATA / _KAFAS_ENVINT_DATA
#define I3_RES_KAF_STAT_ENVINT_DRIVEN_DIST_FS_WERT (RXBUF_UINT32(0))
#define I3_RES_KAF_STAT_ENVINT_DRIVEN_DIST_FS_WERT_UNIT 'km'
#define I3_RES_KAF_STAT_ENVINT_DRIVEN_DIST_FS_WERT_TYPE unsigned long
// Cont the number of km driven with degraded availability / Cont the number of km driven with degraded
// availability
#define I3_RES_KAF_STAT_ENVINT_DRIVEN_TIME_FS_WERT (RXBUF_UINT32(4))
#define I3_RES_KAF_STAT_ENVINT_DRIVEN_TIME_FS_WERT_UNIT 's'
#define I3_RES_KAF_STAT_ENVINT_DRIVEN_TIME_FS_WERT_TYPE unsigned long
// Count the time in seconds driven with degraded availability / Count the time in seconds driven with degraded
// availability
// Skipping _STEUERN_WARNAUSGABE_PPP on 0x4015 which takes arguments
#define I3_PID_KAF_PPP_ANFORDERUNGEN 0x4016
// This job shall respond with the timestamp and type of warning. It shall be possible to read the information
// over a clamp change, which means the information needs to be store in a NVRAM. The response value shall be set
// to 0x00 as default value (i.e. if no acute warning or brake request have been triggered this job shall respond
// with zeros) The type of warning and timestamps shall be related to the type of warning. 1) Acute warning
// request When signal WARN_HDWOBS_FGS in message 198h (SYS3637) is set to 0001b Timestamp_acute = the actual
// system time when the warning happened. 2) Brake request When signal TAR_DCRN_FGS in the message 198h (SYS3637)
// changes from 0xFE to a value less than 0xFE. Timestamp_brake = the actual system time when the warning
// happened. / This job shall respond with the timestamp and type of warning. It shall be possible to read the
// information over a clamp change, which means the information needs to be store in a NVRAM. The response value
// shall be set to 0x00 as default value (i.e. if no acute warning or brake request have been triggered this job
// shall respond with zeros) The type of warning and timestamps shall be related to the type of warning. 1)
// Acute warning request When signal WARN_HDWOBS_FGS in message 198h (SYS3637) is set to 0001b Timestamp_acute =
// the actual system time when the warning happened. 2) Brake request When signal TAR_DCRN_FGS in the message
// 198h (SYS3637) changes from 0xFE to a value less than 0xFE. Timestamp_brake = the actual system time when the
// warning happened.
#define I3_RES_KAF_STAT_TYPE_OF_WARNING (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_TYPE_OF_WARNING_UNIT '0-n'
#define I3_RES_KAF_STAT_TYPE_OF_WARNING_TYPE unsigned char
// 0x01 if only a Brake request according to 2) is triggered 0x02 if only an Acute warning request according to
// 1) is triggered 0x03 if both an Acute warning request and a Brake request is triggered / 0x01 if only a Brake
// request according to 2) is triggered 0x02 if only an Acute warning request according to 1) is triggered 0x03
// if both an Acute warning request and a Brake request is triggered
#define I3_RES_KAF_STAT_TIMESTAMP_ACUTE_WERT (RXBUF_UINT32(1))
#define I3_RES_KAF_STAT_TIMESTAMP_ACUTE_WERT_UNIT 's'
#define I3_RES_KAF_STAT_TIMESTAMP_ACUTE_WERT_TYPE unsigned long
// The time stamp is the system time value (message 328h) when the warning happened / The time stamp is the
// system time value (message 328h) when the warning happened
#define I3_RES_KAF_STAT_TIMESTAMP_BRAKE_WERT (RXBUF_UINT32(5))
#define I3_RES_KAF_STAT_TIMESTAMP_BRAKE_WERT_UNIT 's'
#define I3_RES_KAF_STAT_TIMESTAMP_BRAKE_WERT_TYPE unsigned long
// The time stamp is the system time value (message 328h) when the warning happened. / The time stamp is the
// system time value (message 328h) when the warning happened.
#define I3_PID_KAF__GENERIC_EYEQ2_INFO 0x4017
// EyeQ2 restarts, 1 byte Counter for number of EyeQ2 restarts caused by camera error debouncing as described in
// DTC 0x800ABB - Camera Connection Error / EyeQ2 restarts, 1 byte Counter for number of EyeQ2 restarts caused by
// camera error debouncing as described in DTC 0x800ABB - Camera Connection Error
#define I3_RES_KAF_STAT_EYEQ2_RESTARTS_WERT (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_EYEQ2_RESTARTS_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_EYEQ2_RESTARTS_WERT_TYPE unsigned char
// EyeQ2 restarts, 1 byte Counter for number of EyeQ2 restarts caused by camera error debouncing as described in
// DTC 0x800ABB - Camera Connection Error / EyeQ2 restarts, 1 byte Counter for number of EyeQ2 restarts caused by
// camera error debouncing as described in DTC 0x800ABB - Camera Connection Error
// Skipping _RESET_GENERIC_EYEQ2_INFO on 0x4018 which takes arguments
#define I3_PID_KAF__STATUS_CAMERA_MONITORING_WERT 0x4050
// The DID can be used to monitor the status of the camera -> EyeQ2 image transfer, as well as the camera
// temperature. / The DID can be used to monitor the status of the camera -> EyeQ2 image transfer, as well as the
// camera temperature.
#define I3_RES_KAF_STAT_FRAME_INDEX_WERT (RXBUF_UINT(0))
#define I3_RES_KAF_STAT_FRAME_INDEX_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_FRAME_INDEX_WERT_TYPE unsigned short
// This is a frame counter, that shall be increased for every frame that is not skipped. Frames that are skipped
// for any reason shall not increment this counter. When the counter reaches over 65535, it shall restart from 0.
// The counter shall restart from 0 at every startup of the EyeQ2. / This is a frame counter, that shall be
// increased for every frame that is not skipped. Frames that are skipped for any reason shall not increment this
// counter. When the counter reaches over 65535, it shall restart from 0. The counter shall restart from 0 at
// every startup of the EyeQ2.
#define I3_RES_KAF_STAT_VIDEO_ERROR_COUNT_WERT (RXBUF_UINT(2))
#define I3_RES_KAF_STAT_VIDEO_ERROR_COUNT_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_VIDEO_ERROR_COUNT_WERT_TYPE unsigned short
// The number of bad frames received from the camera (frames dropped due to data / sync errors). This counter
// shall be increased with one for each cycle the video error signal is set in the 0x400 message. / The number of
// bad frames received from the camera (frames dropped due to data/sync errors). This counter shall be increased
// with one for each cycle the Video error signal is set in the 0x400 message.
#define I3_RES_KAF_STAT_DROPPED_FRAME_COUNT_WERT (RXBUF_UINT(4))
#define I3_RES_KAF_STAT_DROPPED_FRAME_COUNT_WERT_UNIT 'Counts'
#define I3_RES_KAF_STAT_DROPPED_FRAME_COUNT_WERT_TYPE unsigned short
// The number of dropped frames. This counter shall be increased when there is a video error and when the EyeQ2
// skips a frame for any other reason, such as too long processing time for the preceding frame. / The number of
// dropped frames. This counter shall be increased when there is a video error and when the EyeQ2 skips a frame
// for any other reason, such as too long processing time for the preceding frame.
#define I3_RES_KAF_STAT_CAMERA_TEMP_WERT (RXBUF_UCHAR(6)-60.0)
#define I3_RES_KAF_STAT_CAMERA_TEMP_WERT_UNIT '°C'
#define I3_RES_KAF_STAT_CAMERA_TEMP_WERT_TYPE unsigned char
// The camera temperature, as read by the EyeQ2 via I2C. The camera temperature shall be read from the EyeQ2
// every 10 seconds. / The camera temperature, as read by the EyeQ2 via I2C. The camera temperature shall be read
// from the EyeQ2 every 10 seconds.
// Skipping STEUERN_ANZEIGE_KOMBI_TLC on 0xA37C which takes arguments
#define I3_PID_KAF_ABSCHALTGRUND_FERNLICHT 0xD341
// Reasons for switching off high beam. / Abschaltgründe für Fernlicht.
#define I3_RES_KAF_STAT_FLA_ENTGEGENKOMMENDES_FAHRZEUG (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_FLA_ENTGEGENKOMMENDES_FAHRZEUG_UNIT '0/1'
#define I3_RES_KAF_STAT_FLA_ENTGEGENKOMMENDES_FAHRZEUG_TYPE unsigned char
// Indicates whether an oncoming vehicle has been detected: 0 = no vehicle detected, 1 = vehicle detected / Gibt
// aus, ob ein entgegenkommendes Fahrzeug erkannt worden ist: 0 = kein Fahrzeug erkannt, 1 = Fahrzeug erkannt
#define I3_RES_KAF_STAT_FLA_VORAUSFAHRENDES_FAHRZEUG (RXBUF_UCHAR(1))
#define I3_RES_KAF_STAT_FLA_VORAUSFAHRENDES_FAHRZEUG_UNIT '0/1'
#define I3_RES_KAF_STAT_FLA_VORAUSFAHRENDES_FAHRZEUG_TYPE unsigned char
// Indicates whether a vehicle in front has been detected: 0 = no vehicle detected, 1 = vehicle detected / Gibt
// aus, ob ein vorausfahrendes Fahrzeug erkannt worden ist: 0 = kein Fahrzeug erkannt, 1 = Fahrzeug erkannt
#define I3_RES_KAF_STAT_FLA_GESCHWINDIGKEITSLIMIT (RXBUF_UCHAR(2))
#define I3_RES_KAF_STAT_FLA_GESCHWINDIGKEITSLIMIT_UNIT '0/1'
#define I3_RES_KAF_STAT_FLA_GESCHWINDIGKEITSLIMIT_TYPE unsigned char
// Indicates whether the speed below the limit has been detected: 0 = speed above the threshold, high beam is
// switched on, 1 = speed below the threshold, high beam is switched off / Gibt aus, ob die Geschwindigkeit
// unterhalb der Grenze erkannt worden ist: 0 = Geschwindigkeit oberhalb der Schwelle, Fernlicht wird
// eingeschaltet, 1 = Geschwindigkeit unterhalb der Schwelle, Fernlicht wird abgeschaltet
#define I3_RES_KAF_STAT_FLA_UMGEBUNGSHELLIGKEIT (RXBUF_UCHAR(3))
#define I3_RES_KAF_STAT_FLA_UMGEBUNGSHELLIGKEIT_UNIT '0/1'
#define I3_RES_KAF_STAT_FLA_UMGEBUNGSHELLIGKEIT_TYPE unsigned char
// Indicates whether ambient brightness (day) has been recognized: 0 = no brightness (night) recognized, 1 =
// brightness (day) recognized / Gibt aus, ob Umgebungshelligkeit (Tag) erkannt worden ist: 0 = kein Helligkeit
// (Nacht) erkannt, 1 = Helligkeit (Tag) erkannt
#define I3_RES_KAF_STAT_FLA_ORTSCHAFTSERKENNUNG (RXBUF_UCHAR(4))
#define I3_RES_KAF_STAT_FLA_ORTSCHAFTSERKENNUNG_UNIT '0/1'
#define I3_RES_KAF_STAT_FLA_ORTSCHAFTSERKENNUNG_TYPE unsigned char
// Indicates whether sufficient lighting has been detected: 0 = insufficient lighting detected, 1 = sufficient
// lighting detected / Gibt aus, ob eine ausreichende Beleuchtung erkannt worden ist: 0 = keine ausreichende
// Beleuchtung erkannt, 1 = ausreichende Beleuchtung erkannt
#define I3_RES_KAF_STAT_FLA_NEBELERKENNUNG (RXBUF_UCHAR(5))
#define I3_RES_KAF_STAT_FLA_NEBELERKENNUNG_UNIT '0/1'
#define I3_RES_KAF_STAT_FLA_NEBELERKENNUNG_TYPE unsigned char
// Indicates whether fog has been detected: 0 = no fog, 1 = fog detected / Gibt aus, ob Nebel erkannt worden ist:
// 0 = kein Nebel, 1 = Nebel erkannt
#define I3_RES_KAF_STAT_FLA_AUTOBAHNMODE (RXBUF_UCHAR(6))
#define I3_RES_KAF_STAT_FLA_AUTOBAHNMODE_UNIT '0/1'
#define I3_RES_KAF_STAT_FLA_AUTOBAHNMODE_TYPE unsigned char
// Indicates whether a motorway has been recognized: 0 = no motorway, 1 = motorway recognized / Gibt aus, ob
// Autobahn erkannt worden ist: 0 = keine Autobahn, 1 = Autobahn erkannt
#define I3_RES_KAF_STAT_FLA_VERZOEGERUNGSZEIT (RXBUF_UCHAR(7))
#define I3_RES_KAF_STAT_FLA_VERZOEGERUNGSZEIT_UNIT '0/1'
#define I3_RES_KAF_STAT_FLA_VERZOEGERUNGSZEIT_TYPE unsigned char
// Indicates whether the high beam is not switched on due to a time delay: 0 = no time delay, 1 = time delay /
// Gibt aus, ob wegen einer Zeiterzögerung das Fernlicht nicht eingeschaltet wird: 0 = keine Zeitverzögerung, 1
// = Zeitverzögerung
#define I3_PID_KAF_KONFIGURATION_KAFAS 0xD374
// Issue of equipment from KAFAS / Ausgabe der Ausstattung von KAFAS
#define I3_RES_KAF_STAT_VORHANDEN_TLC (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_VORHANDEN_TLC_UNIT '0/1'
#define I3_RES_KAF_STAT_VORHANDEN_TLC_TYPE unsigned char
// Indicates whether the time-to-line crossing function is available: 0 = not available; 1 = present / Gibt an,
// ob die Funktion Time-to-Line Crossing vorhanden ist: 0= nicht vorhanden; 1= vorhanden
#define I3_RES_KAF_STAT_VORHANDEN_FLA (RXBUF_UCHAR(1))
#define I3_RES_KAF_STAT_VORHANDEN_FLA_UNIT '0/1'
#define I3_RES_KAF_STAT_VORHANDEN_FLA_TYPE unsigned char
// Indicates whether the high beam assistant function is available: 0 = not available; 1 = present / Gibt an, ob
// die Funktion Fernlichtassistent vorhanden ist: 0= nicht vorhanden; 1= vorhanden
#define I3_RES_KAF_STAT_VORHANDEN_SLI (RXBUF_UCHAR(2))
#define I3_RES_KAF_STAT_VORHANDEN_SLI_UNIT '0/1'
#define I3_RES_KAF_STAT_VORHANDEN_SLI_TYPE unsigned char
// Indicates whether the Speed-Limit-Info function is available: 0 = not available; 1 = present / Gibt an, ob die
// Funktion Speed-Limit-Info vorhanden ist: 0= nicht vorhanden; 1= vorhanden
#define I3_RES_KAF_STAT_VORHANDEN_NPI (RXBUF_UCHAR(3))
#define I3_RES_KAF_STAT_VORHANDEN_NPI_UNIT '0/1'
#define I3_RES_KAF_STAT_VORHANDEN_NPI_TYPE unsigned char
// Indicates whether the NoPassing-Info function is available: 0 = not available; 1 = present / Gibt an, ob die
// Funktion NoPassing-Info vorhanden ist: 0= nicht vorhanden; 1= vorhanden
#define I3_RES_KAF_STAT_VORHANDEN_FCW (RXBUF_UCHAR(4))
#define I3_RES_KAF_STAT_VORHANDEN_FCW_UNIT '0/1'
#define I3_RES_KAF_STAT_VORHANDEN_FCW_TYPE unsigned char
// Indicates whether the Forward Collision Warning function is available: 0 = not available; 1 = present / Gibt
// an, ob die Funktion Forward-Collision-Warning vorhanden ist: 0= nicht vorhanden; 1= vorhanden
#define I3_RES_KAF_STAT_VORHANDEN_PED (RXBUF_UCHAR(5))
#define I3_RES_KAF_STAT_VORHANDEN_PED_UNIT '0/1'
#define I3_RES_KAF_STAT_VORHANDEN_PED_TYPE unsigned char
// Indicates whether the Pedistrian Recognition function is available: 0 = not available; 1 = present / Gibt an,
// ob die Funktion Pedistrian Recognition (Fußgängererkennung) vorhanden ist: 0= nicht vorhanden; 1= vorhanden
#define I3_PID_KAF_KAFAS_VINS_LESEN 0xD393
// Reading out the chassis number from the camera and the control unit. / Auslesen der Fahrgestellnummer aus der
// Kamera und dem Steuergerät.
// Can't yet generate code for STAT_KAFAS_KAM_VIN_TEXT of type string[7], at offset 0. But we account for the 7 bytes
// Output of the 7-digit chassis number from the camera. / Ausgabe der 7-stelligen Fahrgestellnummer aus der
// Kamera.
// Can't yet generate code for STAT_KAFAS_ECU_VIN_TEXT of type string[7], at offset 7. But we account for the 7 bytes
// Output of the 7-digit chassis number from the control unit. / Ausgabe der 7-stelligen Fahrgestellnummer aus
// dem Steuergerät.
#define I3_RES_KAF_STAT_KAFAS_VIN_STATUS_NR (RXBUF_UCHAR(14))
#define I3_RES_KAF_STAT_KAFAS_VIN_STATUS_NR_UNIT '0-n'
#define I3_RES_KAF_STAT_KAFAS_VIN_STATUS_NR_TYPE unsigned char
// Indicates whether the assignment of camera to control unit matches: 0x00: NO MATCH, 0x01: MATCH / Gibt aus, ob
// die Zuordnung Kamera zu Steuergerät übereinstimmt: 0x00: KEINE UEBEREINSTIMMUNG, 0x01: UEBEREINSTIMMUNG
#define I3_PID_KAF_KALIBRIERDATEN_KAFAS 0xD396
// Output of the calibration data from the KAFAS camera / Ausgabe der Kalibrierdaten der KAFAS-Kamera
#define I3_RES_KAF_STAT_OFFLINE_YAW_WERT (RXBUF_UINT(0))
#define I3_RES_KAF_STAT_OFFLINE_YAW_WERT_UNIT 'Pixel'
#define I3_RES_KAF_STAT_OFFLINE_YAW_WERT_TYPE unsigned short
// Offline yaw angle / Offline Yaw-Winkel
#define I3_RES_KAF_STAT_OFFLINE_HORIZON_WERT (RXBUF_UINT(2))
#define I3_RES_KAF_STAT_OFFLINE_HORIZON_WERT_UNIT 'Pixel'
#define I3_RES_KAF_STAT_OFFLINE_HORIZON_WERT_TYPE unsigned short
// Offline horizon angle / Offline Horizon-Winkel
#define I3_RES_KAF_STAT_OFFLINE_ROLL_WERT (RXBUF_UINT(4)/100.0f)
#define I3_RES_KAF_STAT_OFFLINE_ROLL_WERT_UNIT 'Grad'
#define I3_RES_KAF_STAT_OFFLINE_ROLL_WERT_TYPE float
// Offline roll angle / Offline Roll-Winkel
#define I3_RES_KAF_STAT_ONLINE_YAW_WERT (RXBUF_UINT(6))
#define I3_RES_KAF_STAT_ONLINE_YAW_WERT_UNIT 'Pixel'
#define I3_RES_KAF_STAT_ONLINE_YAW_WERT_TYPE unsigned short
// Online yaw angle / Online Yaw-Winkel
#define I3_RES_KAF_STAT_ONLINE_HORIZON_WERT (RXBUF_UINT(8))
#define I3_RES_KAF_STAT_ONLINE_HORIZON_WERT_UNIT 'Pixel'
#define I3_RES_KAF_STAT_ONLINE_HORIZON_WERT_TYPE unsigned short
// Online horizon angle / Online Horizon-Winkel
#define I3_RES_KAF_STAT_ONLINE_ROLL_WERT (RXBUF_UINT(10)/100.0f)
#define I3_RES_KAF_STAT_ONLINE_ROLL_WERT_UNIT 'Grad'
#define I3_RES_KAF_STAT_ONLINE_ROLL_WERT_TYPE float
// Online roll angle / Online Roll-Winkel
#define I3_RES_KAF_STAT_KAM_HOEHE_WERT (RXBUF_UINT(12))
#define I3_RES_KAF_STAT_KAM_HOEHE_WERT_UNIT 'mm'
#define I3_RES_KAF_STAT_KAM_HOEHE_WERT_TYPE unsigned short
// Camera installation height / Kamera-Verbauhöhe
#define I3_RES_KAF_STAT_BRENNWEITE_WERT (RXBUF_UINT(14))
#define I3_RES_KAF_STAT_BRENNWEITE_WERT_UNIT 'Pixel'
#define I3_RES_KAF_STAT_BRENNWEITE_WERT_TYPE unsigned short
// Focal length / Brennweite
#define I3_RES_KAF_STAT_GRABBING_SHIFT_WERT (RXBUF_UINT(16))
#define I3_RES_KAF_STAT_GRABBING_SHIFT_WERT_UNIT 'Pixel'
#define I3_RES_KAF_STAT_GRABBING_SHIFT_WERT_TYPE unsigned short
// Grabbing shift / Grabbing-Shift
// Can't yet generate code for STAT_FAHRGESTELLNR_TEXT of type string[7], at offset 18. But we account for the 7 bytes
// Chassis number in the camera / Fahrgestellnummer in der Kamera
#define I3_PID_KAF_KAMERAVERBINDUNG_ECU 0xD397
// For values see TAB_KAM_VERBINDUNG / Werte siehe TAB_KAM_VERBINDUNG
#define I3_RES_KAF_STAT_KAFAS_VERBINDUNG_KAM_NR (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_KAFAS_VERBINDUNG_KAM_NR_UNIT '0-n'
#define I3_RES_KAF_STAT_KAFAS_VERBINDUNG_KAM_NR_TYPE unsigned char
// For values see TAB_KAM_VERBINDUNG / Werte siehe TAB_KAM_VERBINDUNG
// Skipping TLC_AKTUATOR on 0xD399 which takes arguments
// Skipping DEMO_MODE_FLA on 0xD3A6 which takes arguments
// Skipping FCW_WARNAUSGABE on 0xD3A7 which takes arguments
// Skipping FCW_VERFUEGBARKEITSVERLUST on 0xD3A8 which takes arguments
// Skipping STEUERN_ANZEIGE_KOMBI_SLI on 0xD3A9 which takes arguments
#define I3_PID_KAF_ERGEBNIS_SLI 0xD3AA
// Output of the result of the traffic sign recognition. / Ausgabe des Ergebnis der Verkehrzeichenerkennung.
#define I3_RES_KAF_STAT_KAMERA_ZEICHEN_NR (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_KAMERA_ZEICHEN_NR_UNIT '0-n'
#define I3_RES_KAF_STAT_KAMERA_ZEICHEN_NR_TYPE unsigned char
// Indicates which character was recognized by the camera: Results see TAB_ZEICHEN_KAMERA / Gibt aus, welches
// Zeichen von der Kamera erkannt wurde: Results siehe TAB_ZEICHEN_KAMERA
#define I3_RES_KAF_STAT_KAMERA_GESCHWINDIGKEIT_WERT (RXBUF_UCHAR(1))
#define I3_RES_KAF_STAT_KAMERA_GESCHWINDIGKEIT_WERT_TYPE unsigned char
// Indicates the speed that was recognized in the characters: 0 = cancellation of everything, 5 to 150 in steps
// of 5. / Gibt aus, welche Geschwindigkeit in den Zeichen erkannt wurde: 0 = Aufhebung alles, 5 bis 150 in 5-er
// Schritten.
#define I3_RES_KAF_STAT_KARTE_ZEICHEN_NR (RXBUF_UCHAR(2))
#define I3_RES_KAF_STAT_KARTE_ZEICHEN_NR_UNIT '0-n'
#define I3_RES_KAF_STAT_KARTE_ZEICHEN_NR_TYPE unsigned char
// Indicates which character was read from the card: For results see TAB_ZEICHEN_KARTE / Gibt aus, welches
// Zeichen aus der Karte gelesen wurde: Results siehe TAB_ZEICHEN_KARTE
#define I3_RES_KAF_STAT_KARTE_GESCHWINDIGKEIT_WERT (RXBUF_UCHAR(3))
#define I3_RES_KAF_STAT_KARTE_GESCHWINDIGKEIT_WERT_TYPE unsigned char
// Indicates the speed that was read from the card: 0 = cancel everything, 5 to 150 in steps of 5. / Gibt aus,
// welche Geschwindigkeit aus der Karte gelesen wurde: 0 = Aufhebung alles, 5 bis 150 in 5-er Schritten.
#define I3_RES_KAF_STAT_FUSIONIERT_ZEICHEN_NR (RXBUF_UCHAR(4))
#define I3_RES_KAF_STAT_FUSIONIERT_ZEICHEN_NR_UNIT '0-n'
#define I3_RES_KAF_STAT_FUSIONIERT_ZEICHEN_NR_TYPE unsigned char
// Indicates which character is output from the merged recognition result: Results see TAB_ZEICHEN_FUSIONIERT /
// Gibt aus, welches Zeichen aus den fusioniertem Erkennungsergebnis ausgegeben wird: Results siehe
// TAB_ZEICHEN_FUSIONIERT
#define I3_RES_KAF_STAT_FUSIONIERT_GESCHWINDIGKEIT_WERT (RXBUF_UCHAR(5))
#define I3_RES_KAF_STAT_FUSIONIERT_GESCHWINDIGKEIT_WERT_TYPE unsigned char
// Outputs the speed from the merged recognition result: 0 = cancel everything, 5 to 150 in steps of 5 / Gibt
// aus, welche Geschwindigkeit aus dem fusionierten Erkennungsergebnis ausgegeben wird: 0 = Aufhebung alles, 5
// bis 150 in 5-er Schritten
#define I3_RES_KAF_STAT_GUETE_KAM_SLI_GESCHW_WERT (RXBUF_UCHAR(6))
#define I3_RES_KAF_STAT_GUETE_KAM_SLI_GESCHW_WERT_UNIT '%'
#define I3_RES_KAF_STAT_GUETE_KAM_SLI_GESCHW_WERT_TYPE unsigned char
// Indicates the quality with which the restriction and cancellation sign for speeds was recognized with the
// camera: 0 - 100 / Gibt aus, mit welcher Güte das Beschränkungs- und Aufhebungszeichen für Geschwindigkeiten
// mit der Kamera erkannt wurde: 0 - 100
// Skipping STEUERN_METHODE_SLI on 0xD3AB which takes arguments
// Skipping EMPFEHLUNG_FLA_STFLA on 0xD3AD which takes arguments
// Skipping SELBST_KALIBRIERUNG on 0xD3BD which takes arguments
// Skipping KAFAS_SCHEIBENHEIZUNG on 0xD3CD which takes arguments
#define I3_PID_KAF_SPANNUNG_KLEMME_15N_WERT 0xDAD2
// Voltage value on the control unit at terminal 15N (accurate to one decimal place) / Spannungswert am
// Steuergerät an Klemme 15N (auf eine Nachkommastelle genau)
#define I3_RES_KAF_STAT_SPANNUNG_KLEMME_15N_WERT (RXBUF_UINT(0)/10.0f)
#define I3_RES_KAF_STAT_SPANNUNG_KLEMME_15N_WERT_UNIT 'V'
#define I3_RES_KAF_STAT_SPANNUNG_KLEMME_15N_WERT_TYPE float
// Voltage value on the control unit at terminal 15N (accurate to one decimal place) / Spannungswert am
// Steuergerät an Klemme 15N (auf eine Nachkommastelle genau)
#define I3_PID_KAF__DEBUG_AUSGABE 0xF001
// Debug output for KAFAS / Debug Ausgabe für KAFAS
#define I3_RES_KAF_STAT_DEBUG_AUSGABE (RXBUF_UINT(0))
#define I3_RES_KAF_STAT_DEBUG_AUSGABE_UNIT '0-n'
#define I3_RES_KAF_STAT_DEBUG_AUSGABE_TYPE unsigned short
// Returns the status of whether the debug message output is active / Liefert den Status ob die Ausgabe der
// Debug-Nachrichten aktiv ist
// Skipping _SIM_COUNTRY_CODE on 0xF002 which takes arguments
#define I3_PID_KAF__PEDANTIC_MODE 0xF003
// Pedantic mode for SLI and NPI / Pedantic Mode für SLI und NPI
#define I3_RES_KAF_STAT_PEDANTIC_MODE (RXBUF_UCHAR(0))
#define I3_RES_KAF_STAT_PEDANTIC_MODE_UNIT '0-n'
#define I3_RES_KAF_STAT_PEDANTIC_MODE_TYPE unsigned char
// Activation status of Pedantic Mode for SLI and NPI / Aktivierungsstatus des Pedantic Mode für SLI und NPI
#define I3_PID_KAF__ERASE_MICRO_CORE_DUMP 0xF004
// Delete from MicroCoreDump / Löschen vom MicroCoreDump
#define I3_RES_KAF_STAT_ERASE_RESULT (RXBUF_UINT(0))
#define I3_RES_KAF_STAT_ERASE_RESULT_UNIT '0-n'
#define I3_RES_KAF_STAT_ERASE_RESULT_TYPE unsigned short
// Deletion result / Löschergebnis

View File

@ -1,28 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/kafas20.json: KAF 5D: Camera based driver assistance system
// This generated code makes it easier to process CANBUS messages from the KAF ecu in a BMW i3
//
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__FASTA_FLA_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4001
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__KAFAS_ECU_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4002
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__KAFAS_TLC_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4003
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_KAFAS_FCW_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4004
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__KAFAS_SLI_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4005
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__STATUS_SAFETY_DIAG_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x400E
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__STATUS_WARNZEITPUNKT_FCW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x400F
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_FASTA_PPP_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4010
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_FASTA_CCM_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4011
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__KAFAS_ENVINT_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4012
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_PPP_ANFORDERUNGEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4016
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__GENERIC_EYEQ2_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4017
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__STATUS_CAMERA_MONITORING_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4050
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_ABSCHALTGRUND_FERNLICHT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD341
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_KONFIGURATION_KAFAS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD374
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_KAFAS_VINS_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD393
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_KALIBRIERDATEN_KAFAS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD396
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_KAMERAVERBINDUNG_ECU, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD397
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_ERGEBNIS_SLI, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD3AA
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF_SPANNUNG_KLEMME_15N_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAD2
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__DEBUG_AUSGABE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF001
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__PEDANTIC_MODE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF003
//{ I3_ECU_KAF_TX, I3_ECU_KAF_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KAF__ERASE_MICRO_CORE_DUMP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF004

View File

@ -1,730 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/ucx2_i01.json: KLE 15: Convenience charging electronics
// This generated code makes it easier to process CANBUS messages from the KLE ecu in a BMW i3
//
case I3_PID_KLE_FLASH_DSPS: { // 0xAF43
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_FLASH_DSPS", 1);
break;
}
unsigned char STAT_DSP_FLASHING = (RXBUF_UCHAR(0));
// DSP programming status. / Status der DSP-Programmierung.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "FLASH_DSPS", "STAT_DSP_FLASHING", STAT_DSP_FLASHING, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_BETRIEBSZUSTAND_LADEGERAET: { // 0xDE84
if (datalen < 16) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_BETRIEBSZUSTAND_LADEGERAET", 16);
break;
}
float STAT_NETZFREQUENZ_PHASE_1_WERT = (RXBUF_UCHAR(0)/4.0f);
// Current grid frequency phase 1 / Aktuelle Netzfrequenz Phase 1
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "STAT_NETZFREQUENZ_PHASE_1_WERT", STAT_NETZFREQUENZ_PHASE_1_WERT, "\"Hz\"");
unsigned char BF_LADEGERAET_DERATING = (RXBUF_UCHAR(1));
// Reason for derating / Grund für Derating
// BF_LADEGERAET_DERATING is a BITFIELD of size unsigned char. We don't yet generate definitions for each bit, we treat as the host data type
// STAT_DERATING_BIT0: Mask: 0x01 - Overtemperature: 0 = not active; 1 = active
// STAT_DERATING_BIT1: Mask: 0x02 - Mains frequency too low: 0 = not active; 1 = active
// STAT_DERATING_BIT2: Mask: 0x04 - Failure of a charging module: 0 = not active; 1 = active
// STAT_DERATING_BIT3: Mask: 0x08 - DC current limitation: 0 = not active; 1 = active
// STAT_DERATING_BIT4: Mask: 0x10 - Network available power of lower nominal power: 0 = not active; 1 = active
// STAT_DERATING_BIT5: Mask: 0x20 - Reserved
// STAT_DERATING_BIT6: Mask: 0x40 - Reserved
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "BF_LADEGERAET_DERATING", (unsigned long)BF_LADEGERAET_DERATING, "\"Bit\"");
float STAT_LEISTUNG_DERATING_WERT = (RXBUF_UINT(2)*10.0f);
// Derating performance / Derating Leistung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "STAT_LEISTUNG_DERATING_WERT", STAT_LEISTUNG_DERATING_WERT, "\"W\"");
unsigned char STAT_DERATING_WERT = (RXBUF_UCHAR(4));
// Derating / Derating
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "STAT_DERATING_WERT", STAT_DERATING_WERT, "\"%\"");
unsigned char BF_LADEGERAET_FEHLERZUSTAND_UCXII = (RXBUF_UCHAR(5));
// Charger fault conditions / Ladegerät Fehlerzustände
// BF_LADEGERAET_FEHLERZUSTAND_UCXII is a BITFIELD of size unsigned char. We don't yet generate definitions for each bit, we treat as the host data type
// STAT_FEHLERZUSTAND_BIT0: Mask: 0x01 - Derating: 0 = not active; 1 = active
// STAT_FEHLERZUSTAND_BIT1: Mask: 0x02 - Charge interruption: 0 = not active; 1 = active
// STAT_FEHLERZUSTAND_BIT2: Mask: 0x04 - Failsafe: 0 = not active; 1 = active
// STAT_FEHLERZUSTAND_BIT3: Mask: 0x08 - Communication failure: 0 = not active; 1 = active
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "BF_LADEGERAET_FEHLERZUSTAND_UCXII", (unsigned long)BF_LADEGERAET_FEHLERZUSTAND_UCXII, "\"Bit\"");
unsigned short BF_AUSLOESER_FAILSAFE_UCXII = (RXBUF_UINT(6));
// Failsafe trigger / Auslöser Failsafe
// BF_AUSLOESER_FAILSAFE_UCXII is a BITFIELD of size unsigned int. We don't yet generate definitions for each bit, we treat as the host data type
// STAT_AUSLOESER_FAILSAFE_BIT0: Mask: 0x001 - Hardware error: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT1: Mask: 0x002 - Undervoltage AC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT2: Mask: 0x004 - Overvoltage AC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT3: Mask: 0x008 - Overcurrent AC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT4: Mask: 0x010 - Undervoltage DC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT5: Mask: 0x020 - Overvoltage DC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT6: Mask: 0x040 - Overcurrent DC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT7: Mask: 0x080 - Temperature: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT8: Mask: 0x100 - Communication error: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT9: Mask: 0x200 - Load initialization timeout: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT10: Mask: 0x400 - Controller undervoltage: 0 = not active; 1 = active
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "BF_AUSLOESER_FAILSAFE_UCXII", (unsigned long)BF_AUSLOESER_FAILSAFE_UCXII, "\"Bit\"");
unsigned char BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG = (RXBUF_UCHAR(8));
// Cause of charging interruption / Ursache für Ladeunterbrechung
// BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG is a BITFIELD of size unsigned char. We don't yet generate definitions for each bit, we treat as the host data type
// STAT_URSACHE_LADEUNTERBRECHUNG_BIT0: Mask: 0x01 - Forced separation of the plug: 0 = not active; 1 = active
// STAT_URSACHE_LADEUNTERBRECHUNG_BIT1: Mask: 0x02 - AC voltage missing or grid connection unstable: 0 = not active; 1 = active
// STAT_URSACHE_LADEUNTERBRECHUNG_BIT2: Mask: 0x04 - Connector not locked: 0 = not active; 1 = active
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG", (unsigned long)BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG, "\"Bit\"");
unsigned char STAT_BETRIEBSART_NR = (RXBUF_UCHAR(9));
// Operating mode / Betriebsart
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "STAT_BETRIEBSART_NR", STAT_BETRIEBSART_NR, "\"0-n\"");
float STAT_NETZFREQUENZ_PHASE_2_WERT = (RXBUF_UCHAR(10)/4.0f);
// Current grid frequency phase 2 / Aktuelle Netzfrequenz Phase 2
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "STAT_NETZFREQUENZ_PHASE_2_WERT", STAT_NETZFREQUENZ_PHASE_2_WERT, "\"Hz\"");
float STAT_NETZFREQUENZ_PHASE_3_WERT = (RXBUF_UCHAR(11)/4.0f);
// Current grid frequency phase 3 / Aktuelle Netzfrequenz Phase 3
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "STAT_NETZFREQUENZ_PHASE_3_WERT", STAT_NETZFREQUENZ_PHASE_3_WERT, "\"Hz\"");
unsigned long BF_MOD_ERR = (RXBUF_UINT32(12));
// Error states load module / Fehlerzustände Lademodul
// BF_MOD_ERR is a BITFIELD of size unsigned long. We don't yet generate definitions for each bit, we treat as the host data type
// STAT_BF_DSP_ERR_HVDCV_OORL: Mask: 0x00000001 - PM HVDC voltage sensor outside lower threshold: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_HVDCV_OORH: Mask: 0x00000002 - PM HVDC voltage sensor outside upper threshold: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_HVDCI_OORH: Mask: 0x00000004 - PM HVDC current sensor outside upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_IRES_OORH: Mask: 0x00000008 - PM sensor resonance current outside the upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VBUS_OORL: Mask: 0x00000010 - PM sensor bus voltage outside the lower threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VBUS_OORH: Mask: 0x00000020 - PM sensor bus voltage outside the upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_OVERTEMPERATURE: Mask: 0x00000040 - PM temperature sensor outside upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_UNDERTEMPERATURE: Mask: 0x00000080 - PM temperature sensor outside lower threshold: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_HVDCV_SHGND: Mask: 0x00000100 - PM HVDC voltage sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_HVDCI_SHGND: Mask: 0x00000200 - PM HVDC current sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_AC_I_OORH: Mask: 0x00000400 - PM AC current sensor outside upper threshold: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_AC_I_SHGND: Mask: 0x00000800 - PM AC current sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LX_SHBATT: Mask: 0x00001000 - PM AC Lx current sensor short circuit to positive: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LX_SHGND: Mask: 0x00002000 - PM AC Lx current sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_IRES_SHBATT: Mask: 0x00004000 - PM sensor resonance current short circuit to plus: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_IRES_SHGND: Mask: 0x00008000 - PM sensor resonance current short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CAN_ALIVE: Mask: 0x00010000 - PM error test ALIVE: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CAN_MSG401_TOUT: Mask: 0x00020000 - PM error timeout telegram 0x401: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CAN_MSG300_TOUT: Mask: 0x00040000 - PM error timeout telegram 0x300: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_SPI_PROTOCOL: Mask: 0x00080000 - PM error SPI protocol: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_SPI_WIPER0_MISMATCH: Mask: 0x00100000 - PM error SPI Wiper0 discrepancy: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_SPI_WIPER1_MISMATCH: Mask: 0x00200000 - PM error SPI Wiper1 discrepancy: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_RAM: Mask: 0x00400000 - PM error RAM: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_WATCHDOG: Mask: 0x00800000 - PM watchdog error: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_STACKOVFL: Mask: 0x01000000 - PM stack overflow: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_DATA_INTEGRITY: Mask: 0x02000000 - PM data integrity: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CLOCK: Mask: 0x04000000 - PM clock: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CRC_CALIBRATION: Mask: 0x08000000 - PM CRC calibration: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LY_SHBATT: Mask: 0x10000000 - PM AC Ly voltage sensor short circuit to plus: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LY_SHGND: Mask: 0x20000000 - PM AC Ly voltage sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LX_OORH: Mask: 0x40000000 - PM AC Lx voltage sensor outside upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LY_OORH: Mask: 0x80000000 - PM AC Ly voltage sensor outside upper threshold: 0 = not active; 1 = active
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET", "BF_MOD_ERR", (unsigned long)BF_MOD_ERR, "\"Bit\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_LEISTUNG: { // 0xDE85
if (datalen < 4) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_LEISTUNG", 4);
break;
}
unsigned char STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT = (RXBUF_UCHAR(0));
// Charge cycle efficiency / Wirkungsgrad Ladezyklus
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_LEISTUNG", "STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT", STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT, "\"%\"");
unsigned char STAT_WIRKUNGSGRAD_DC_WERT = (RXBUF_UCHAR(1));
// Efficiency DC / Wirkungsgrad DC
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_LEISTUNG", "STAT_WIRKUNGSGRAD_DC_WERT", STAT_WIRKUNGSGRAD_DC_WERT, "\"%\"");
unsigned short STAT_LADEGERAET_DC_HV_LEISTUNG_WERT = (RXBUF_UINT(2));
// Instantaneous power output in the intermediate circuit / Abgegebende Momentanleistung in den Zwischenkreis
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_LEISTUNG", "STAT_LADEGERAET_DC_HV_LEISTUNG_WERT", STAT_LADEGERAET_DC_HV_LEISTUNG_WERT, "\"W\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_SPANNUNG: { // 0xDE86
if (datalen < 12) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_SPANNUNG", 12);
break;
}
unsigned short STAT_SPANNUNG_RMS_AC_PHASE_1_WERT = (RXBUF_UINT(0));
// RMS values of the AC conductor voltages (phase 1) / Effektivwerte der AC Leiterspannungen (Phase1)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_SPANNUNG", "STAT_SPANNUNG_RMS_AC_PHASE_1_WERT", STAT_SPANNUNG_RMS_AC_PHASE_1_WERT, "\"V\"");
float STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT = (RXBUF_UINT(2)/10.0f);
// HV DC voltage upper limit / HV DC Spannungsobergrenze
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_SPANNUNG", "STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT", STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT, "\"V\"");
float STAT_SPANNUNG_DC_HV_WERT = (RXBUF_UINT(4)/10.0f);
// HV DC voltage / HV DC Spannung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_SPANNUNG", "STAT_SPANNUNG_DC_HV_WERT", STAT_SPANNUNG_DC_HV_WERT, "\"V\"");
float STAT_SPANNUNG_KL30_WERT = (RXBUF_UCHAR(6)/10.0f);
// KL30 voltage / KL30 Spannung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_SPANNUNG", "STAT_SPANNUNG_KL30_WERT", STAT_SPANNUNG_KL30_WERT, "\"V\"");
float STAT_SPANNUNG_KL30C_WERT = (RXBUF_UCHAR(7)/10.0f);
// KL30C voltage / KL30C Spannung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_SPANNUNG", "STAT_SPANNUNG_KL30C_WERT", STAT_SPANNUNG_KL30C_WERT, "\"V\"");
unsigned short STAT_SPANNUNG_RMS_AC_PHASE_2_WERT = (RXBUF_UINT(8));
// RMS values of the AC conductor voltages (phase 2) / Effektivwerte der AC Leiterspannungen (Phase 2)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_SPANNUNG", "STAT_SPANNUNG_RMS_AC_PHASE_2_WERT", STAT_SPANNUNG_RMS_AC_PHASE_2_WERT, "\"V\"");
unsigned short STAT_SPANNUNG_RMS_AC_PHASE_3_WERT = (RXBUF_UINT(10));
// RMS values of the AC conductor voltages (phase 3) / Effektivwerte der AC Leiterspannungen (Phase 3)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_SPANNUNG", "STAT_SPANNUNG_RMS_AC_PHASE_3_WERT", STAT_SPANNUNG_RMS_AC_PHASE_3_WERT, "\"V\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_STROM: { // 0xDE87
if (datalen < 14) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_STROM", 14);
break;
}
float STAT_STROM_AC_PHASE_1_WERT = (RXBUF_UINT(0)/10.0f);
// AC current phase 1 / AC Strom Phase 1
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM", "STAT_STROM_AC_PHASE_1_WERT", STAT_STROM_AC_PHASE_1_WERT, "\"A\"");
float STAT_STROM_AC_MAX_GESPEICHERT_WERT = (RXBUF_UINT(2)/10.0f);
// Maximum stored AC current / Maximal gespeicherter AC Strom
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM", "STAT_STROM_AC_MAX_GESPEICHERT_WERT", STAT_STROM_AC_MAX_GESPEICHERT_WERT, "\"A\"");
float STAT_STROM_HV_DC_WERT = (RXBUF_UINT(4)/10.0f-204.7);
// HV DC electricity / HV DC Strom
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM", "STAT_STROM_HV_DC_WERT", STAT_STROM_HV_DC_WERT, "\"A\"");
float STAT_STROM_HV_DC_MAX_LIMIT_WERT = (RXBUF_UINT(6)/10.0f);
// Maximum permitted HV DC current / Maximal erlaubter HV DC Strom
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM", "STAT_STROM_HV_DC_MAX_LIMIT_WERT", STAT_STROM_HV_DC_MAX_LIMIT_WERT, "\"A\"");
float STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT = (RXBUF_UINT(8)/10.0f-204.7);
// Maximum stored DC current / Maximal gespeicherter DC Strom
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM", "STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT", STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT, "\"A\"");
float STAT_STROM_AC_PHASE_2_WERT = (RXBUF_UINT(10)/10.0f);
// AC current phase 2 / AC Strom Phase 2
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM", "STAT_STROM_AC_PHASE_2_WERT", STAT_STROM_AC_PHASE_2_WERT, "\"A\"");
float STAT_STROM_AC_PHASE_3_WERT = (RXBUF_UINT(12)/10.0f);
// AC current phase 3 / AC Strom Phase 3
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM", "STAT_STROM_AC_PHASE_3_WERT", STAT_STROM_AC_PHASE_3_WERT, "\"A\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_AC_PHASENANZAHL: { // 0xDF25
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_AC_PHASENANZAHL", 1);
break;
}
unsigned char STAT_AC_PHASENANZAHL_WERT = (RXBUF_UCHAR(0));
// Status of the number of AC phases / Status AC-Phasenanzahl
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "AC_PHASENANZAHL", "STAT_AC_PHASENANZAHL_WERT", STAT_AC_PHASENANZAHL_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_LADEDAUER: { // 0xDFB0
if (datalen < 8) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_LADEDAUER", 8);
break;
}
unsigned long STAT_MINUTEN_LADEZYKLUS_WERT = (RXBUF_UINT32(0));
// Charging time in minutes / Ladezeit in Minuten
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADEDAUER", "STAT_MINUTEN_LADEZYKLUS_WERT", STAT_MINUTEN_LADEZYKLUS_WERT, "\"min\"");
unsigned short STAT_SEKUNDEN_LADEZYKLUS_WERT = (RXBUF_UINT(4));
// Loading time in seconds / Ladezeit in Sekunden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_LADEDAUER", "STAT_SEKUNDEN_LADEZYKLUS_WERT", STAT_SEKUNDEN_LADEZYKLUS_WERT, "\"s\"");
unsigned short STAT_LADEZYKLEN_WERT = (RXBUF_UINT(6));
// Number of charging cycles / Anzahl der Ladezyklen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_LADEDAUER", "STAT_LADEZYKLEN_WERT", STAT_LADEZYKLEN_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_TEMPERATUREN: { // 0xDFB1
if (datalen < 10) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_TEMPERATUREN", 10);
break;
}
unsigned char STAT_NTC1_TEMPERATUR_WERT = (RXBUF_UCHAR(0)-75.0);
// internal temperature (temperature sensor 1) / interne Temperatur (Temperatursensor 1)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC1_TEMPERATUR_WERT", STAT_NTC1_TEMPERATUR_WERT, "\"°C\"");
unsigned char STAT_NTC2_TEMPERATUR_WERT = (RXBUF_UCHAR(1)-75.0);
// internal temperature (temperature sensor 2) / interne Temperatur (Temperatursensor 2)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC2_TEMPERATUR_WERT", STAT_NTC2_TEMPERATUR_WERT, "\"°C\"");
unsigned char STAT_NTC3_TEMPERATUR_WERT = (RXBUF_UCHAR(2)-75.0);
// internal temperature (temperature sensor 3) / interne Temperatur (Temperatursensor 3)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC3_TEMPERATUR_WERT", STAT_NTC3_TEMPERATUR_WERT, "\"°C\"");
unsigned char STAT_NTC4_TEMPERATUR_WERT = (RXBUF_UCHAR(3)-75.0);
// internal temperature (temperature sensor 4) / interne Temperatur (Temperatursensor 4)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC4_TEMPERATUR_WERT", STAT_NTC4_TEMPERATUR_WERT, "\"°C\"");
unsigned char STAT_NTC5_TEMPERATUR_WERT = (RXBUF_UCHAR(4)-75.0);
// internal temperature (temperature sensor 5) / interne Temperatur (Temperatursensor 5)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC5_TEMPERATUR_WERT", STAT_NTC5_TEMPERATUR_WERT, "\"°C\"");
unsigned char STAT_NTC6_TEMPERATUR_WERT = (RXBUF_UCHAR(5)-75.0);
// internal temperature (temperature sensor 6) / interne Temperatur (Temperatursensor 6)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC6_TEMPERATUR_WERT", STAT_NTC6_TEMPERATUR_WERT, "\"°C\"");
unsigned char STAT_NTC7_TEMPERAUTR_WERT = (RXBUF_UCHAR(6)-75.0);
// internal temperature (temperature sensor 7) / interne Temperatur (Temperatursensor 7)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC7_TEMPERAUTR_WERT", STAT_NTC7_TEMPERAUTR_WERT, "\"°C\"");
unsigned char STAT_NTC8_TEMPERATUR_WERT = (RXBUF_UCHAR(7)-75.0);
// internal temperature (temperature sensor 8) / interne Tempeartur (Temperatursensor 8)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC8_TEMPERATUR_WERT", STAT_NTC8_TEMPERATUR_WERT, "\"°C\"");
unsigned char STAT_NTC9_TEMPEARTUR_WERT = (RXBUF_UCHAR(8)-75.0);
// internal temperature (temperature sensor 9) / interne Temperatur (Temperatursensor 9)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC9_TEMPEARTUR_WERT", STAT_NTC9_TEMPEARTUR_WERT, "\"°C\"");
unsigned char STAT_NTC10_TEMPEARTUR_WERT = (RXBUF_UCHAR(9)-75.0);
// internal temperature (temperature sensor 10) / interne Temperatur (Temperatursensor 10)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_TEMPERATUREN", "STAT_NTC10_TEMPEARTUR_WERT", STAT_NTC10_TEMPEARTUR_WERT, "\"°C\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_LEISTUNG2: { // 0xDFB4
if (datalen < 4) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_LEISTUNG2", 4);
break;
}
unsigned char STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT_0XDFB4 = (RXBUF_UCHAR(0));
// Charge cycle efficiency / Wirkungsgrad Ladezyklus
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_LEISTUNG2", "STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT_0XDFB4", STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT_0XDFB4, "\"%\"");
unsigned char STAT_WIRKUNGSGRAD_DC_WERT_0XDFB4 = (RXBUF_UCHAR(1));
// Efficiency DC / Wirkungsgrad DC
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "LADEGERAET_LEISTUNG2", "STAT_WIRKUNGSGRAD_DC_WERT_0XDFB4", STAT_WIRKUNGSGRAD_DC_WERT_0XDFB4, "\"%\"");
unsigned short STAT_LADEGERAET_DC_HV_LEISTUNG_WERT_0XDFB4 = (RXBUF_UINT(2));
// Instantaneous power output in the intermediate circuit / Abgegebende Momentanleistung in den Zwischenkreis
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_LEISTUNG2", "STAT_LADEGERAET_DC_HV_LEISTUNG_WERT_0XDFB4", STAT_LADEGERAET_DC_HV_LEISTUNG_WERT_0XDFB4, "\"W\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_LADE_HISTOGRAMM: { // 0xDFB6
if (datalen < 40) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_LADE_HISTOGRAMM", 40);
break;
}
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT = (RXBUF_UINT32(0));
// Seconds at temperature below 0 ° C / Sekunden bei Temperatur unter 0°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT", STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT = (RXBUF_UINT32(4));
// Seconds at a temperature between 0 ° C and 45 ° C / Sekunden bei Temperatur zwischen 0°C und 45°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT", STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT = (RXBUF_UINT32(8));
// Seconds at a temperature between 46 ° C and 60 ° C / Sekunden bei Temperatur zwischen 46°C und 60°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT", STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT = (RXBUF_UINT32(12));
// Seconds in the temperature range between 61 ° C and 70 ° C / Sekunden im Temperaturbereich zwischen 61°C und
// 70°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT", STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT = (RXBUF_UINT32(16));
// Seconds at a temperature between 71 ° C and 85 ° C / Sekunden bei Temperatur zwischen 71°C und 85°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT", STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT = (RXBUF_UINT32(20));
// Seconds at temperatures above 85 ° C / Sekunden bei Temperatur über 85°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT", STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT = (RXBUF_UINT32(24));
// Seconds at power below 1000W / Sekunden bei Leistung unter 1000W
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT", STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT = (RXBUF_UINT32(28));
// Seconds at power between 1001W and 2000W / Sekunden bei Leistung zwischen 1001W und 2000W
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT", STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT = (RXBUF_UINT32(32));
// Seconds at power between 2001W and 3000W / Sekunden bei Leistung zwischen 2001W und 3000W
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT", STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT, "\"s\"");
unsigned long STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT = (RXBUF_UINT32(36));
// Seconds at power over 3000W / Sekunden bei Leistung über 3000W
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM", "STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT", STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT, "\"s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_LADE_HISTOGRAMM2: { // 0xDFB7
if (datalen < 40) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_LADE_HISTOGRAMM2", 40);
break;
}
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT_0XDFB7 = (RXBUF_UINT32(0));
// Seconds at temperature below 0 ° C / Sekunden bei Temperatur unter 0°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT_0XDFB7", STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT_0XDFB7 = (RXBUF_UINT32(4));
// Seconds at a temperature between 0 ° C and 45 ° C / Sekunden bei Temperatur zwischen 0°C und 45°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT_0XDFB7", STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT_0XDFB7 = (RXBUF_UINT32(8));
// Seconds at a temperature between 46 ° C and 60 ° C / Sekunden bei Temperatur zwischen 46°C und 60°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT_0XDFB7", STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT_0XDFB7 = (RXBUF_UINT32(12));
// Seconds in the temperature range between 61 ° C and 70 ° C / Sekunden im Temperaturbereich zwischen 61°C und
// 70°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT_0XDFB7", STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT_0XDFB7 = (RXBUF_UINT32(16));
// Seconds at a temperature between 71 ° C and 85 ° C / Sekunden bei Temperatur zwischen 71°C und 85°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT_0XDFB7", STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT_0XDFB7 = (RXBUF_UINT32(20));
// Seconds at temperatures above 85 ° C / Sekunden bei Temperatur über 85°C
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT_0XDFB7", STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT_0XDFB7 = (RXBUF_UINT32(24));
// Seconds at power below 1000W / Sekunden bei Leistung unter 1000W
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT_0XDFB7", STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT_0XDFB7 = (RXBUF_UINT32(28));
// Seconds at power between 1001W and 2000W / Sekunden bei Leistung zwischen 1001W und 2000W
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT_0XDFB7", STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT_0XDFB7 = (RXBUF_UINT32(32));
// Seconds at power between 2001W and 3000W / Sekunden bei Leistung zwischen 2001W und 3000W
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT_0XDFB7", STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT_0XDFB7, "\"s\"");
unsigned long STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT_0XDFB7 = (RXBUF_UINT32(36));
// Seconds at power over 3000W / Sekunden bei Leistung über 3000W
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADE_HISTOGRAMM2", "STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT_0XDFB7", STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT_0XDFB7, "\"s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_LADEDAUER2: { // 0xDFB8
if (datalen < 8) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_LADEDAUER2", 8);
break;
}
unsigned long STAT_MINUTEN_LADEZYKLUS_WERT_0XDFB8 = (RXBUF_UINT32(0));
// Charging time in minutes / Ladezeit in Minuten
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEGERAET_LADEDAUER2", "STAT_MINUTEN_LADEZYKLUS_WERT_0XDFB8", STAT_MINUTEN_LADEZYKLUS_WERT_0XDFB8, "\"min\"");
unsigned short STAT_SEKUNDEN_LADEZYKLUS_WERT_0XDFB8 = (RXBUF_UINT(4));
// Loading time in seconds / Ladezeit in Sekunden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_LADEDAUER2", "STAT_SEKUNDEN_LADEZYKLUS_WERT_0XDFB8", STAT_SEKUNDEN_LADEZYKLUS_WERT_0XDFB8, "\"s\"");
unsigned short STAT_LADEZYKLEN_WERT_0XDFB8 = (RXBUF_UINT(6));
// Number of charging cycles / Anzahl der Ladezyklen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_LADEDAUER2", "STAT_LADEZYKLEN_WERT_0XDFB8", STAT_LADEZYKLEN_WERT_0XDFB8, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_UMSCHALTMATRIX: { // 0xDFB9
if (datalen < 20) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_UMSCHALTMATRIX", 20);
break;
}
unsigned long STAT_SCHALTER1_SCHALTZYKLEN_ANZAHL_WERT = (RXBUF_UINT32(0));
// Number of switching cycles for switch 1 (multi-phase charging: phase 1) / Anzahl von Schaltzyklen für Schalter
// 1 (mehrphasiges Laden: Phase 1)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "UMSCHALTMATRIX", "STAT_SCHALTER1_SCHALTZYKLEN_ANZAHL_WERT", STAT_SCHALTER1_SCHALTZYKLEN_ANZAHL_WERT, "");
unsigned long STAT_SCHALTER2_SCHALTZYKLEN_ANZAHL_WERT = (RXBUF_UINT32(4));
// Number of switching cycles for switch 2 (multi-phase charging: phase 2) / Anzahl von Schaltzyklen für Schalter
// 2 (mehrphasiges Laden: Phase 2)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "UMSCHALTMATRIX", "STAT_SCHALTER2_SCHALTZYKLEN_ANZAHL_WERT", STAT_SCHALTER2_SCHALTZYKLEN_ANZAHL_WERT, "");
unsigned long STAT_SCHALTER3_SCHALTZYKLEN_ANZAHL_WERT = (RXBUF_UINT32(8));
// Number of switching cycles for switch 3 (multi-phase charging: phase 3) / Anzahl von Schaltzyklen für Schalter
// 3 (mehrphasiges Laden: Phase 3)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "UMSCHALTMATRIX", "STAT_SCHALTER3_SCHALTZYKLEN_ANZAHL_WERT", STAT_SCHALTER3_SCHALTZYKLEN_ANZAHL_WERT, "");
unsigned long STAT_SCHALTER4_SCHALTZYKLEN_ANZAHL_WERT = (RXBUF_UINT32(12));
// Number of switching cycles for switch 4 (multi-phase charging: changeover) / Anzahl von Schaltzyklen für
// Schalter 4 (mehrphasiges Laden: Umschaltung)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "UMSCHALTMATRIX", "STAT_SCHALTER4_SCHALTZYKLEN_ANZAHL_WERT", STAT_SCHALTER4_SCHALTZYKLEN_ANZAHL_WERT, "");
unsigned char STAT_SCHALTER1 = (RXBUF_UCHAR(16));
// State of switch 1 (0 = open, 1 = closed) / Zustand vom Schalter 1 (0= offen, 1=geschlossen)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "UMSCHALTMATRIX", "STAT_SCHALTER1", STAT_SCHALTER1, "\"0/1\"");
unsigned char STAT_SCHALTER2 = (RXBUF_UCHAR(17));
// State of switch 2 (0 = open, 1 = closed) / Zustand vom Schalter 2 (0= offen, 1=geschlossen)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "UMSCHALTMATRIX", "STAT_SCHALTER2", STAT_SCHALTER2, "\"0/1\"");
unsigned char STAT_SCHALTER3 = (RXBUF_UCHAR(18));
// State of switch 3 (0 = open, 1 = closed) / Zustand vom Schalter 3 (0= offen, 1=geschlossen)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "UMSCHALTMATRIX", "STAT_SCHALTER3", STAT_SCHALTER3, "\"0/1\"");
unsigned char STAT_SCHALTER4 = (RXBUF_UCHAR(19));
// State of switch 4 (0 = charger 1, 1 = charger 2) / Zustand vom Schalter 4 (0= Ladegerät 1, 1=Ladegerät 2)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "UMSCHALTMATRIX", "STAT_SCHALTER4", STAT_SCHALTER4, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_SPANNUNG2: { // 0xDFBA
if (datalen < 12) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_SPANNUNG2", 12);
break;
}
unsigned short STAT_SPANNUNG_RMS_AC_PHASE_1_WERT_0XDFBA = (RXBUF_UINT(0));
// RMS values of the AC conductor voltages (phase 1) / Effektivwerte der AC Leiterspannungen (Phase1)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_SPANNUNG2", "STAT_SPANNUNG_RMS_AC_PHASE_1_WERT_0XDFBA", STAT_SPANNUNG_RMS_AC_PHASE_1_WERT_0XDFBA, "\"V\"");
float STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT_0XDFBA = (RXBUF_UINT(2)/10.0f);
// HV DC voltage upper limit / HV DC Spannungsobergrenze
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_SPANNUNG2", "STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT_0XDFBA", STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT_0XDFBA, "\"V\"");
float STAT_SPANNUNG_DC_HV_WERT_0XDFBA = (RXBUF_UINT(4)/10.0f);
// HV DC voltage / HV DC Spannung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_SPANNUNG2", "STAT_SPANNUNG_DC_HV_WERT_0XDFBA", STAT_SPANNUNG_DC_HV_WERT_0XDFBA, "\"V\"");
float STAT_SPANNUNG_KL30_WERT_0XDFBA = (RXBUF_UCHAR(6)/10.0f);
// KL30 voltage / KL30 Spannung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_SPANNUNG2", "STAT_SPANNUNG_KL30_WERT_0XDFBA", STAT_SPANNUNG_KL30_WERT_0XDFBA, "\"V\"");
float STAT_SPANNUNG_KL30C_WERT_0XDFBA = (RXBUF_UCHAR(7)/10.0f);
// KL30C voltage / KL30C Spannung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_SPANNUNG2", "STAT_SPANNUNG_KL30C_WERT_0XDFBA", STAT_SPANNUNG_KL30C_WERT_0XDFBA, "\"V\"");
unsigned short STAT_SPANNUNG_RMS_AC_PHASE_2_WERT_0XDFBA = (RXBUF_UINT(8));
// RMS values of the AC conductor voltages (phase 2) / Effektivwerte der AC Leiterspannungen (Phase 2)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_SPANNUNG2", "STAT_SPANNUNG_RMS_AC_PHASE_2_WERT_0XDFBA", STAT_SPANNUNG_RMS_AC_PHASE_2_WERT_0XDFBA, "\"V\"");
unsigned short STAT_SPANNUNG_RMS_AC_PHASE_3_WERT_0XDFBA = (RXBUF_UINT(10));
// RMS values of the AC conductor voltages (phase 3) / Effektivwerte der AC Leiterspannungen (Phase 3)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEGERAET_SPANNUNG2", "STAT_SPANNUNG_RMS_AC_PHASE_3_WERT_0XDFBA", STAT_SPANNUNG_RMS_AC_PHASE_3_WERT_0XDFBA, "\"V\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEGERAET_STROM2: { // 0xDFBB
if (datalen < 14) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEGERAET_STROM2", 14);
break;
}
float STAT_STROM_AC_PHASE_1_WERT_0XDFBB = (RXBUF_UINT(0)/10.0f);
// AC current phase 1 / AC Strom Phase 1
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM2", "STAT_STROM_AC_PHASE_1_WERT_0XDFBB", STAT_STROM_AC_PHASE_1_WERT_0XDFBB, "\"A\"");
float STAT_STROM_AC_MAX_GESPEICHERT_WERT_0XDFBB = (RXBUF_UINT(2)/10.0f);
// Maximum stored AC current / Maximal gespeicherter AC Strom
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM2", "STAT_STROM_AC_MAX_GESPEICHERT_WERT_0XDFBB", STAT_STROM_AC_MAX_GESPEICHERT_WERT_0XDFBB, "\"A\"");
float STAT_STROM_HV_DC_WERT_0XDFBB = (RXBUF_UINT(4)/10.0f-204.7);
// HV DC electricity / HV DC Strom
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM2", "STAT_STROM_HV_DC_WERT_0XDFBB", STAT_STROM_HV_DC_WERT_0XDFBB, "\"A\"");
float STAT_STROM_HV_DC_MAX_LIMIT_WERT_0XDFBB = (RXBUF_UINT(6)/10.0f);
// Maximum permitted HV DC current / Maximal erlaubter HV DC Strom
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM2", "STAT_STROM_HV_DC_MAX_LIMIT_WERT_0XDFBB", STAT_STROM_HV_DC_MAX_LIMIT_WERT_0XDFBB, "\"A\"");
float STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT_0XDFBB = (RXBUF_UINT(8)/10.0f-204.7);
// Maximum stored DC current / Maximal gespeicherter DC Strom
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM2", "STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT_0XDFBB", STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT_0XDFBB, "\"A\"");
float STAT_STROM_AC_PHASE_2_WERT_0XDFBB = (RXBUF_UINT(10)/10.0f);
// AC current phase 2 / AC Strom Phase 2
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM2", "STAT_STROM_AC_PHASE_2_WERT_0XDFBB", STAT_STROM_AC_PHASE_2_WERT_0XDFBB, "\"A\"");
float STAT_STROM_AC_PHASE_3_WERT_0XDFBB = (RXBUF_UINT(12)/10.0f);
// AC current phase 3 / AC Strom Phase 3
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "LADEGERAET_STROM2", "STAT_STROM_AC_PHASE_3_WERT_0XDFBB", STAT_STROM_AC_PHASE_3_WERT_0XDFBB, "\"A\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_BETRIEBSZUSTAND_LADEGERAET2: { // 0xDFBC
if (datalen < 12) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_BETRIEBSZUSTAND_LADEGERAET2", 12);
break;
}
float STAT_NETZFREQUENZ_PHASE_1_WERT_0XDFBC = (RXBUF_UCHAR(0)/4.0f);
// Current grid frequency phase 1 / Aktuelle Netzfrequenz Phase 1
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "STAT_NETZFREQUENZ_PHASE_1_WERT_0XDFBC", STAT_NETZFREQUENZ_PHASE_1_WERT_0XDFBC, "\"Hz\"");
unsigned char BF_LADEGERAET_DERATING_0XDFBC = (RXBUF_UCHAR(1));
// Reason for derating / Grund für Derating
// BF_LADEGERAET_DERATING_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "BF_LADEGERAET_DERATING_0XDFBC", (unsigned long)BF_LADEGERAET_DERATING_0XDFBC, "\"Bit\"");
float STAT_LEISTUNG_DERATING_WERT_0XDFBC = (RXBUF_UINT(2)*10.0f);
// Derating performance / Derating Leistung
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "STAT_LEISTUNG_DERATING_WERT_0XDFBC", STAT_LEISTUNG_DERATING_WERT_0XDFBC, "\"W\"");
unsigned char STAT_DERATING_WERT_0XDFBC = (RXBUF_UCHAR(4));
// Derating / Derating
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "STAT_DERATING_WERT_0XDFBC", STAT_DERATING_WERT_0XDFBC, "\"%\"");
unsigned char BF_LADEGERAET_FEHLERZUSTAND_UCXII_0XDFBC = (RXBUF_UCHAR(5));
// Charger fault conditions / Ladegerät Fehlerzustände
// BF_LADEGERAET_FEHLERZUSTAND_UCXII_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "BF_LADEGERAET_FEHLERZUSTAND_UCXII_0XDFBC", (unsigned long)BF_LADEGERAET_FEHLERZUSTAND_UCXII_0XDFBC, "\"Bit\"");
unsigned char BF_AUSLOESER_FAILSAFE_UCXII_0XDFBC = (RXBUF_UCHAR(6));
// Failsafe trigger / Auslöser Failsafe
// BF_AUSLOESER_FAILSAFE_UCXII_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "BF_AUSLOESER_FAILSAFE_UCXII_0XDFBC", (unsigned long)BF_AUSLOESER_FAILSAFE_UCXII_0XDFBC, "\"Bit\"");
unsigned char BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_0XDFBC = (RXBUF_UCHAR(7));
// Cause of charging interruption / Ursache für Ladeunterbrechung
// BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_0XDFBC", (unsigned long)BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_0XDFBC, "\"Bit\"");
unsigned char STAT_BETRIEBSART_NR_0XDFBC = (RXBUF_UCHAR(8));
// Operating mode / Betriebsart
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "STAT_BETRIEBSART_NR_0XDFBC", STAT_BETRIEBSART_NR_0XDFBC, "\"0-n\"");
float STAT_NETZFREQUENZ_PHASE_2_WERT_0XDFBC = (RXBUF_UCHAR(9)/4.0f);
// Current grid frequency phase 2 / Aktuelle Netzfrequenz Phase 2
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "STAT_NETZFREQUENZ_PHASE_2_WERT_0XDFBC", STAT_NETZFREQUENZ_PHASE_2_WERT_0XDFBC, "\"Hz\"");
float STAT_NETZFREQUENZ_PHASE_3_WERT_0XDFBC = (RXBUF_UCHAR(10)/4.0f);
// Current grid frequency phase 3 / Aktuelle Netzfrequenz Phase 3
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "STAT_NETZFREQUENZ_PHASE_3_WERT_0XDFBC", STAT_NETZFREQUENZ_PHASE_3_WERT_0XDFBC, "\"Hz\"");
unsigned char BF_MOD_ERR_0XDFBC = (RXBUF_UCHAR(11));
// Error states load module / Fehlerzustände Lademodul
// BF_MOD_ERR_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lx%s\n", "KLE", "BETRIEBSZUSTAND_LADEGERAET2", "BF_MOD_ERR_0XDFBC", (unsigned long)BF_MOD_ERR_0XDFBC, "\"Bit\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_LADEDAUER_LADEART: { // 0xDFBD
if (datalen < 16) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_LADEDAUER_LADEART", 16);
break;
}
unsigned long STAT_MINUTEN_LADEZYKLUS_1PH_WERT = (RXBUF_UINT32(0));
// Charging time in minutes for single-phase charging / Ladezeit in Minuten für einphasiges Laden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEDAUER_LADEART", "STAT_MINUTEN_LADEZYKLUS_1PH_WERT", STAT_MINUTEN_LADEZYKLUS_1PH_WERT, "\"min\"");
unsigned short STAT_SEKUNDEN_LADEZYKLUS_1PH_WERT = (RXBUF_UINT(4));
// Charging time in seconds for single-phase charging / Ladezeit in Sekunden für einphasiges Laden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEDAUER_LADEART", "STAT_SEKUNDEN_LADEZYKLUS_1PH_WERT", STAT_SEKUNDEN_LADEZYKLUS_1PH_WERT, "\"s\"");
unsigned short STAT_LADEZYKLUS_1PH_WERT = (RXBUF_UINT(6));
// Number of charging cycles, single-phase charging / Anzahl Ladezyklus einphasiges Laden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEDAUER_LADEART", "STAT_LADEZYKLUS_1PH_WERT", STAT_LADEZYKLUS_1PH_WERT, "");
unsigned long STAT_MINUTEN_LADEZYKLUS_3PH_WERT = (RXBUF_UINT32(8));
// Charging time in minutes for multi-phase charging / Ladezeit in Minuten für mehrphasiges Laden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "KLE", "LADEDAUER_LADEART", "STAT_MINUTEN_LADEZYKLUS_3PH_WERT", STAT_MINUTEN_LADEZYKLUS_3PH_WERT, "\"min\"");
unsigned short STAT_SEKUNDEN_LADEZYKLUS_3PH_WERT = (RXBUF_UINT(12));
// Charging time in seconds for multi-phase charging / Ladezeit in Sekunden für mehrphasiges Laden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEDAUER_LADEART", "STAT_SEKUNDEN_LADEZYKLUS_3PH_WERT", STAT_SEKUNDEN_LADEZYKLUS_3PH_WERT, "\"s\"");
unsigned short STAT_LADEZYKLUS_3PH_WERT = (RXBUF_UINT(14));
// Number of charging cycles, multi-phase charging / Anzahl Ladezyklus mehrphasiges Laden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "KLE", "LADEDAUER_LADEART", "STAT_LADEZYKLUS_3PH_WERT", STAT_LADEZYKLUS_3PH_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_KLE_FLASH_DSPS_0XF000: { // 0xF000
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_KLE_FLASH_DSPS_0XF000", 1);
break;
}
unsigned char STAT_DSP_FLASHING_0XF000 = (RXBUF_UCHAR(0));
// DSP programming status. / Status der DSP-Programmierung.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "KLE", "FLASH_DSPS_0XF000", "STAT_DSP_FLASHING_0XF000", STAT_DSP_FLASHING_0XF000, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}

View File

@ -1,688 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/ucx2_i01.json: KLE 15: Convenience charging electronics
// This generated code makes it easier to process CANBUS messages from the KLE ecu in a BMW i3
//
#define I3_ECU_KLE_TX 0x06F115
#define I3_ECU_KLE_RX 0x0615F1
#define I3_PID_KLE_FLASH_DSPS 0xAF43
// Programming of DSP / Programmierung von DSP
#define I3_RES_KLE_STAT_DSP_FLASHING (RXBUF_UCHAR(0))
#define I3_RES_KLE_STAT_DSP_FLASHING_UNIT '0-n'
#define I3_RES_KLE_STAT_DSP_FLASHING_TYPE unsigned char
// DSP programming status. / Status der DSP-Programmierung.
#define I3_PID_KLE_BETRIEBSZUSTAND_LADEGERAET 0xDE84
// Operating modes charger / Betriebsarten Ladegerät
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_1_WERT (RXBUF_UCHAR(0)/4.0f)
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_1_WERT_UNIT 'Hz'
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_1_WERT_TYPE float
// Current grid frequency phase 1 / Aktuelle Netzfrequenz Phase 1
// BF_LADEGERAET_DERATING is a BITFIELD of size unsigned char. We don't yet generate definitions for each bit, we treat as the host data type
// Reason for derating / Grund für Derating
// STAT_DERATING_BIT0: Mask: 0x01 - Overtemperature: 0 = not active; 1 = active
// STAT_DERATING_BIT1: Mask: 0x02 - Mains frequency too low: 0 = not active; 1 = active
// STAT_DERATING_BIT2: Mask: 0x04 - Failure of a charging module: 0 = not active; 1 = active
// STAT_DERATING_BIT3: Mask: 0x08 - DC current limitation: 0 = not active; 1 = active
// STAT_DERATING_BIT4: Mask: 0x10 - Network available power of lower nominal power: 0 = not active; 1 = active
// STAT_DERATING_BIT5: Mask: 0x20 - Reserved
// STAT_DERATING_BIT6: Mask: 0x40 - Reserved
#define I3_RES_KLE_BF_LADEGERAET_DERATING (RXBUF_UCHAR(1))
#define I3_RES_KLE_BF_LADEGERAET_DERATING_UNIT 'Bit'
#define I3_RES_KLE_BF_LADEGERAET_DERATING_TYPE unsigned char
// Reason for derating / Grund für Derating
#define I3_RES_KLE_STAT_LEISTUNG_DERATING_WERT (RXBUF_UINT(2)*10.0f)
#define I3_RES_KLE_STAT_LEISTUNG_DERATING_WERT_UNIT 'W'
#define I3_RES_KLE_STAT_LEISTUNG_DERATING_WERT_TYPE float
// Derating performance / Derating Leistung
#define I3_RES_KLE_STAT_DERATING_WERT (RXBUF_UCHAR(4))
#define I3_RES_KLE_STAT_DERATING_WERT_UNIT '%'
#define I3_RES_KLE_STAT_DERATING_WERT_TYPE unsigned char
// Derating / Derating
// BF_LADEGERAET_FEHLERZUSTAND_UCXII is a BITFIELD of size unsigned char. We don't yet generate definitions for each bit, we treat as the host data type
// Charger fault conditions / Ladegerät Fehlerzustände
// STAT_FEHLERZUSTAND_BIT0: Mask: 0x01 - Derating: 0 = not active; 1 = active
// STAT_FEHLERZUSTAND_BIT1: Mask: 0x02 - Charge interruption: 0 = not active; 1 = active
// STAT_FEHLERZUSTAND_BIT2: Mask: 0x04 - Failsafe: 0 = not active; 1 = active
// STAT_FEHLERZUSTAND_BIT3: Mask: 0x08 - Communication failure: 0 = not active; 1 = active
#define I3_RES_KLE_BF_LADEGERAET_FEHLERZUSTAND_UCXII (RXBUF_UCHAR(5))
#define I3_RES_KLE_BF_LADEGERAET_FEHLERZUSTAND_UCXII_UNIT 'Bit'
#define I3_RES_KLE_BF_LADEGERAET_FEHLERZUSTAND_UCXII_TYPE unsigned char
// Charger fault conditions / Ladegerät Fehlerzustände
// BF_AUSLOESER_FAILSAFE_UCXII is a BITFIELD of size unsigned int. We don't yet generate definitions for each bit, we treat as the host data type
// Failsafe trigger / Auslöser Failsafe
// STAT_AUSLOESER_FAILSAFE_BIT0: Mask: 0x001 - Hardware error: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT1: Mask: 0x002 - Undervoltage AC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT2: Mask: 0x004 - Overvoltage AC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT3: Mask: 0x008 - Overcurrent AC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT4: Mask: 0x010 - Undervoltage DC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT5: Mask: 0x020 - Overvoltage DC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT6: Mask: 0x040 - Overcurrent DC: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT7: Mask: 0x080 - Temperature: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT8: Mask: 0x100 - Communication error: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT9: Mask: 0x200 - Load initialization timeout: 0 = not active; 1 = active
// STAT_AUSLOESER_FAILSAFE_BIT10: Mask: 0x400 - Controller undervoltage: 0 = not active; 1 = active
#define I3_RES_KLE_BF_AUSLOESER_FAILSAFE_UCXII (RXBUF_UINT(6))
#define I3_RES_KLE_BF_AUSLOESER_FAILSAFE_UCXII_UNIT 'Bit'
#define I3_RES_KLE_BF_AUSLOESER_FAILSAFE_UCXII_TYPE unsigned short
// Failsafe trigger / Auslöser Failsafe
// BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG is a BITFIELD of size unsigned char. We don't yet generate definitions for each bit, we treat as the host data type
// Cause of charging interruption / Ursache für Ladeunterbrechung
// STAT_URSACHE_LADEUNTERBRECHUNG_BIT0: Mask: 0x01 - Forced separation of the plug: 0 = not active; 1 = active
// STAT_URSACHE_LADEUNTERBRECHUNG_BIT1: Mask: 0x02 - AC voltage missing or grid connection unstable: 0 = not active; 1 = active
// STAT_URSACHE_LADEUNTERBRECHUNG_BIT2: Mask: 0x04 - Connector not locked: 0 = not active; 1 = active
#define I3_RES_KLE_BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG (RXBUF_UCHAR(8))
#define I3_RES_KLE_BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_UNIT 'Bit'
#define I3_RES_KLE_BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_TYPE unsigned char
// Cause of charging interruption / Ursache für Ladeunterbrechung
#define I3_RES_KLE_STAT_BETRIEBSART_NR (RXBUF_UCHAR(9))
#define I3_RES_KLE_STAT_BETRIEBSART_NR_UNIT '0-n'
#define I3_RES_KLE_STAT_BETRIEBSART_NR_TYPE unsigned char
// Operating mode / Betriebsart
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_2_WERT (RXBUF_UCHAR(10)/4.0f)
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_2_WERT_UNIT 'Hz'
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_2_WERT_TYPE float
// Current grid frequency phase 2 / Aktuelle Netzfrequenz Phase 2
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_3_WERT (RXBUF_UCHAR(11)/4.0f)
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_3_WERT_UNIT 'Hz'
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_3_WERT_TYPE float
// Current grid frequency phase 3 / Aktuelle Netzfrequenz Phase 3
// BF_MOD_ERR is a BITFIELD of size unsigned long. We don't yet generate definitions for each bit, we treat as the host data type
// Error states load module / Fehlerzustände Lademodul
// STAT_BF_DSP_ERR_HVDCV_OORL: Mask: 0x00000001 - PM HVDC voltage sensor outside lower threshold: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_HVDCV_OORH: Mask: 0x00000002 - PM HVDC voltage sensor outside upper threshold: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_HVDCI_OORH: Mask: 0x00000004 - PM HVDC current sensor outside upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_IRES_OORH: Mask: 0x00000008 - PM sensor resonance current outside the upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VBUS_OORL: Mask: 0x00000010 - PM sensor bus voltage outside the lower threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VBUS_OORH: Mask: 0x00000020 - PM sensor bus voltage outside the upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_OVERTEMPERATURE: Mask: 0x00000040 - PM temperature sensor outside upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_UNDERTEMPERATURE: Mask: 0x00000080 - PM temperature sensor outside lower threshold: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_HVDCV_SHGND: Mask: 0x00000100 - PM HVDC voltage sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_HVDCI_SHGND: Mask: 0x00000200 - PM HVDC current sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_AC_I_OORH: Mask: 0x00000400 - PM AC current sensor outside upper threshold: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_AC_I_SHGND: Mask: 0x00000800 - PM AC current sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LX_SHBATT: Mask: 0x00001000 - PM AC Lx current sensor short circuit to positive: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LX_SHGND: Mask: 0x00002000 - PM AC Lx current sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_IRES_SHBATT: Mask: 0x00004000 - PM sensor resonance current short circuit to plus: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_IRES_SHGND: Mask: 0x00008000 - PM sensor resonance current short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CAN_ALIVE: Mask: 0x00010000 - PM error test ALIVE: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CAN_MSG401_TOUT: Mask: 0x00020000 - PM error timeout telegram 0x401: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CAN_MSG300_TOUT: Mask: 0x00040000 - PM error timeout telegram 0x300: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_SPI_PROTOCOL: Mask: 0x00080000 - PM error SPI protocol: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_SPI_WIPER0_MISMATCH: Mask: 0x00100000 - PM error SPI Wiper0 discrepancy: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_SPI_WIPER1_MISMATCH: Mask: 0x00200000 - PM error SPI Wiper1 discrepancy: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_RAM: Mask: 0x00400000 - PM error RAM: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_WATCHDOG: Mask: 0x00800000 - PM watchdog error: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_STACKOVFL: Mask: 0x01000000 - PM stack overflow: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_DATA_INTEGRITY: Mask: 0x02000000 - PM data integrity: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CLOCK: Mask: 0x04000000 - PM clock: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_CRC_CALIBRATION: Mask: 0x08000000 - PM CRC calibration: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LY_SHBATT: Mask: 0x10000000 - PM AC Ly voltage sensor short circuit to plus: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LY_SHGND: Mask: 0x20000000 - PM AC Ly voltage sensor short circuit to ground: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LX_OORH: Mask: 0x40000000 - PM AC Lx voltage sensor outside upper threshold value: 0 = not active; 1 = active
// STAT_BF_DSP_ERR_VAC_LY_OORH: Mask: 0x80000000 - PM AC Ly voltage sensor outside upper threshold: 0 = not active; 1 = active
#define I3_RES_KLE_BF_MOD_ERR (RXBUF_UINT32(12))
#define I3_RES_KLE_BF_MOD_ERR_UNIT 'Bit'
#define I3_RES_KLE_BF_MOD_ERR_TYPE unsigned long
// Error states load module / Fehlerzustände Lademodul
#define I3_PID_KLE_LADEGERAET_LEISTUNG 0xDE85
// Power values intermediate circuit of the charger / Leistungswerte Zwischenkreis des Ladegeräts
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT (RXBUF_UCHAR(0))
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT_UNIT '%'
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT_TYPE unsigned char
// Charge cycle efficiency / Wirkungsgrad Ladezyklus
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_DC_WERT (RXBUF_UCHAR(1))
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_DC_WERT_UNIT '%'
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_DC_WERT_TYPE unsigned char
// Efficiency DC / Wirkungsgrad DC
#define I3_RES_KLE_STAT_LADEGERAET_DC_HV_LEISTUNG_WERT (RXBUF_UINT(2))
#define I3_RES_KLE_STAT_LADEGERAET_DC_HV_LEISTUNG_WERT_UNIT 'W'
#define I3_RES_KLE_STAT_LADEGERAET_DC_HV_LEISTUNG_WERT_TYPE unsigned short
// Instantaneous power output in the intermediate circuit / Abgegebende Momentanleistung in den Zwischenkreis
#define I3_PID_KLE_LADEGERAET_SPANNUNG 0xDE86
// AC and DC voltages charger / AC und DC Spannungen Ladegerät
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_1_WERT (RXBUF_UINT(0))
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_1_WERT_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_1_WERT_TYPE unsigned short
// RMS values of the AC conductor voltages (phase 1) / Effektivwerte der AC Leiterspannungen (Phase1)
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT (RXBUF_UINT(2)/10.0f)
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT_TYPE float
// HV DC voltage upper limit / HV DC Spannungsobergrenze
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_WERT (RXBUF_UINT(4)/10.0f)
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_WERT_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_WERT_TYPE float
// HV DC voltage / HV DC Spannung
#define I3_RES_KLE_STAT_SPANNUNG_KL30_WERT (RXBUF_UCHAR(6)/10.0f)
#define I3_RES_KLE_STAT_SPANNUNG_KL30_WERT_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_KL30_WERT_TYPE float
// KL30 voltage / KL30 Spannung
#define I3_RES_KLE_STAT_SPANNUNG_KL30C_WERT (RXBUF_UCHAR(7)/10.0f)
#define I3_RES_KLE_STAT_SPANNUNG_KL30C_WERT_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_KL30C_WERT_TYPE float
// KL30C voltage / KL30C Spannung
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_2_WERT (RXBUF_UINT(8))
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_2_WERT_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_2_WERT_TYPE unsigned short
// RMS values of the AC conductor voltages (phase 2) / Effektivwerte der AC Leiterspannungen (Phase 2)
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_3_WERT (RXBUF_UINT(10))
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_3_WERT_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_3_WERT_TYPE unsigned short
// RMS values of the AC conductor voltages (phase 3) / Effektivwerte der AC Leiterspannungen (Phase 3)
#define I3_PID_KLE_LADEGERAET_STROM 0xDE87
// AC and DC currents charger / AC und DC Ströme Ladegerät
#define I3_RES_KLE_STAT_STROM_AC_PHASE_1_WERT (RXBUF_UINT(0)/10.0f)
#define I3_RES_KLE_STAT_STROM_AC_PHASE_1_WERT_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_AC_PHASE_1_WERT_TYPE float
// AC current phase 1 / AC Strom Phase 1
#define I3_RES_KLE_STAT_STROM_AC_MAX_GESPEICHERT_WERT (RXBUF_UINT(2)/10.0f)
#define I3_RES_KLE_STAT_STROM_AC_MAX_GESPEICHERT_WERT_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_AC_MAX_GESPEICHERT_WERT_TYPE float
// Maximum stored AC current / Maximal gespeicherter AC Strom
#define I3_RES_KLE_STAT_STROM_HV_DC_WERT (RXBUF_UINT(4)/10.0f-204.7)
#define I3_RES_KLE_STAT_STROM_HV_DC_WERT_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_HV_DC_WERT_TYPE float
// HV DC electricity / HV DC Strom
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_LIMIT_WERT (RXBUF_UINT(6)/10.0f)
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_LIMIT_WERT_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_LIMIT_WERT_TYPE float
// Maximum permitted HV DC current / Maximal erlaubter HV DC Strom
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT (RXBUF_UINT(8)/10.0f-204.7)
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT_TYPE float
// Maximum stored DC current / Maximal gespeicherter DC Strom
#define I3_RES_KLE_STAT_STROM_AC_PHASE_2_WERT (RXBUF_UINT(10)/10.0f)
#define I3_RES_KLE_STAT_STROM_AC_PHASE_2_WERT_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_AC_PHASE_2_WERT_TYPE float
// AC current phase 2 / AC Strom Phase 2
#define I3_RES_KLE_STAT_STROM_AC_PHASE_3_WERT (RXBUF_UINT(12)/10.0f)
#define I3_RES_KLE_STAT_STROM_AC_PHASE_3_WERT_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_AC_PHASE_3_WERT_TYPE float
// AC current phase 3 / AC Strom Phase 3
#define I3_PID_KLE_AC_PHASENANZAHL 0xDF25
// Status of the number of AC phases / Status AC-Phasenanzahl
#define I3_RES_KLE_STAT_AC_PHASENANZAHL_WERT (RXBUF_UCHAR(0))
#define I3_RES_KLE_STAT_AC_PHASENANZAHL_WERT_TYPE unsigned char
// Status of the number of AC phases / Status AC-Phasenanzahl
#define I3_PID_KLE_LADEGERAET_LADEDAUER 0xDFB0
// Information on the charging time / Information zur Ladedauer
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_WERT (RXBUF_UINT32(0))
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_WERT_UNIT 'min'
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_WERT_TYPE unsigned long
// Charging time in minutes / Ladezeit in Minuten
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_WERT (RXBUF_UINT(4))
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_WERT_TYPE unsigned short
// Loading time in seconds / Ladezeit in Sekunden
#define I3_RES_KLE_STAT_LADEZYKLEN_WERT (RXBUF_UINT(6))
#define I3_RES_KLE_STAT_LADEZYKLEN_WERT_TYPE unsigned short
// Number of charging cycles / Anzahl der Ladezyklen
#define I3_PID_KLE_LADEGERAET_TEMPERATUREN 0xDFB1
// Reading out temperatures / Auslesen Temperaturen
#define I3_RES_KLE_STAT_NTC1_TEMPERATUR_WERT (RXBUF_UCHAR(0)-75.0)
#define I3_RES_KLE_STAT_NTC1_TEMPERATUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC1_TEMPERATUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 1) / interne Temperatur (Temperatursensor 1)
#define I3_RES_KLE_STAT_NTC2_TEMPERATUR_WERT (RXBUF_UCHAR(1)-75.0)
#define I3_RES_KLE_STAT_NTC2_TEMPERATUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC2_TEMPERATUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 2) / interne Temperatur (Temperatursensor 2)
#define I3_RES_KLE_STAT_NTC3_TEMPERATUR_WERT (RXBUF_UCHAR(2)-75.0)
#define I3_RES_KLE_STAT_NTC3_TEMPERATUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC3_TEMPERATUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 3) / interne Temperatur (Temperatursensor 3)
#define I3_RES_KLE_STAT_NTC4_TEMPERATUR_WERT (RXBUF_UCHAR(3)-75.0)
#define I3_RES_KLE_STAT_NTC4_TEMPERATUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC4_TEMPERATUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 4) / interne Temperatur (Temperatursensor 4)
#define I3_RES_KLE_STAT_NTC5_TEMPERATUR_WERT (RXBUF_UCHAR(4)-75.0)
#define I3_RES_KLE_STAT_NTC5_TEMPERATUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC5_TEMPERATUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 5) / interne Temperatur (Temperatursensor 5)
#define I3_RES_KLE_STAT_NTC6_TEMPERATUR_WERT (RXBUF_UCHAR(5)-75.0)
#define I3_RES_KLE_STAT_NTC6_TEMPERATUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC6_TEMPERATUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 6) / interne Temperatur (Temperatursensor 6)
#define I3_RES_KLE_STAT_NTC7_TEMPERAUTR_WERT (RXBUF_UCHAR(6)-75.0)
#define I3_RES_KLE_STAT_NTC7_TEMPERAUTR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC7_TEMPERAUTR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 7) / interne Temperatur (Temperatursensor 7)
#define I3_RES_KLE_STAT_NTC8_TEMPERATUR_WERT (RXBUF_UCHAR(7)-75.0)
#define I3_RES_KLE_STAT_NTC8_TEMPERATUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC8_TEMPERATUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 8) / interne Tempeartur (Temperatursensor 8)
#define I3_RES_KLE_STAT_NTC9_TEMPEARTUR_WERT (RXBUF_UCHAR(8)-75.0)
#define I3_RES_KLE_STAT_NTC9_TEMPEARTUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC9_TEMPEARTUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 9) / interne Temperatur (Temperatursensor 9)
#define I3_RES_KLE_STAT_NTC10_TEMPEARTUR_WERT (RXBUF_UCHAR(9)-75.0)
#define I3_RES_KLE_STAT_NTC10_TEMPEARTUR_WERT_UNIT '°C'
#define I3_RES_KLE_STAT_NTC10_TEMPEARTUR_WERT_TYPE unsigned char
// internal temperature (temperature sensor 10) / interne Temperatur (Temperatursensor 10)
#define I3_PID_KLE_LADEGERAET_LEISTUNG2 0xDFB4
// Power values for second charger (multi-phase charging) / Leistungswerte für zweites Ladegerät (mehrphasiges
// Laden)
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT_0XDFB4 (RXBUF_UCHAR(0))
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT_0XDFB4_UNIT '%'
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_LADEZYKLUS_WERT_0XDFB4_TYPE unsigned char
// Charge cycle efficiency / Wirkungsgrad Ladezyklus
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_DC_WERT_0XDFB4 (RXBUF_UCHAR(1))
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_DC_WERT_0XDFB4_UNIT '%'
#define I3_RES_KLE_STAT_WIRKUNGSGRAD_DC_WERT_0XDFB4_TYPE unsigned char
// Efficiency DC / Wirkungsgrad DC
#define I3_RES_KLE_STAT_LADEGERAET_DC_HV_LEISTUNG_WERT_0XDFB4 (RXBUF_UINT(2))
#define I3_RES_KLE_STAT_LADEGERAET_DC_HV_LEISTUNG_WERT_0XDFB4_UNIT 'W'
#define I3_RES_KLE_STAT_LADEGERAET_DC_HV_LEISTUNG_WERT_0XDFB4_TYPE unsigned short
// Instantaneous power output in the intermediate circuit / Abgegebende Momentanleistung in den Zwischenkreis
#define I3_PID_KLE_LADEGERAET_LADE_HISTOGRAMM 0xDFB6
// Charge histogram related to temperature and power / Ladehistogramm bezüglich Temperatur und Leistung
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT (RXBUF_UINT32(0))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT_TYPE unsigned long
// Seconds at temperature below 0 ° C / Sekunden bei Temperatur unter 0°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT (RXBUF_UINT32(4))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT_TYPE unsigned long
// Seconds at a temperature between 0 ° C and 45 ° C / Sekunden bei Temperatur zwischen 0°C und 45°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT (RXBUF_UINT32(8))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT_TYPE unsigned long
// Seconds at a temperature between 46 ° C and 60 ° C / Sekunden bei Temperatur zwischen 46°C und 60°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT (RXBUF_UINT32(12))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT_TYPE unsigned long
// Seconds in the temperature range between 61 ° C and 70 ° C / Sekunden im Temperaturbereich zwischen 61°C und
// 70°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT (RXBUF_UINT32(16))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT_TYPE unsigned long
// Seconds at a temperature between 71 ° C and 85 ° C / Sekunden bei Temperatur zwischen 71°C und 85°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT (RXBUF_UINT32(20))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT_TYPE unsigned long
// Seconds at temperatures above 85 ° C / Sekunden bei Temperatur über 85°C
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT (RXBUF_UINT32(24))
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT_TYPE unsigned long
// Seconds at power below 1000W / Sekunden bei Leistung unter 1000W
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT (RXBUF_UINT32(28))
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT_TYPE unsigned long
// Seconds at power between 1001W and 2000W / Sekunden bei Leistung zwischen 1001W und 2000W
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT (RXBUF_UINT32(32))
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT_TYPE unsigned long
// Seconds at power between 2001W and 3000W / Sekunden bei Leistung zwischen 2001W und 3000W
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT (RXBUF_UINT32(36))
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT_TYPE unsigned long
// Seconds at power over 3000W / Sekunden bei Leistung über 3000W
#define I3_PID_KLE_LADEGERAET_LADE_HISTOGRAMM2 0xDFB7
// Charging histogram relating to temperature and power for a second charger (multi-phase charging). /
// Ladehistogramm bezüglich Temperatur und Leistung für ein zweites Ladegerät (mehrphasiges Laden).
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT_0XDFB7 (RXBUF_UINT32(0))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_1_WERT_0XDFB7_TYPE unsigned long
// Seconds at temperature below 0 ° C / Sekunden bei Temperatur unter 0°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT_0XDFB7 (RXBUF_UINT32(4))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_2_WERT_0XDFB7_TYPE unsigned long
// Seconds at a temperature between 0 ° C and 45 ° C / Sekunden bei Temperatur zwischen 0°C und 45°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT_0XDFB7 (RXBUF_UINT32(8))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_3_WERT_0XDFB7_TYPE unsigned long
// Seconds at a temperature between 46 ° C and 60 ° C / Sekunden bei Temperatur zwischen 46°C und 60°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT_0XDFB7 (RXBUF_UINT32(12))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_4_WERT_0XDFB7_TYPE unsigned long
// Seconds in the temperature range between 61 ° C and 70 ° C / Sekunden im Temperaturbereich zwischen 61°C und
// 70°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT_0XDFB7 (RXBUF_UINT32(16))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_5_WERT_0XDFB7_TYPE unsigned long
// Seconds at a temperature between 71 ° C and 85 ° C / Sekunden bei Temperatur zwischen 71°C und 85°C
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT_0XDFB7 (RXBUF_UINT32(20))
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_TEMPERATUR_BEREICH_6_WERT_0XDFB7_TYPE unsigned long
// Seconds at temperatures above 85 ° C / Sekunden bei Temperatur über 85°C
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT_0XDFB7 (RXBUF_UINT32(24))
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_1_WERT_0XDFB7_TYPE unsigned long
// Seconds at power below 1000W / Sekunden bei Leistung unter 1000W
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT_0XDFB7 (RXBUF_UINT32(28))
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_2_WERT_0XDFB7_TYPE unsigned long
// Seconds at power between 1001W and 2000W / Sekunden bei Leistung zwischen 1001W und 2000W
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT_0XDFB7 (RXBUF_UINT32(32))
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_3_WERT_0XDFB7_TYPE unsigned long
// Seconds at power between 2001W and 3000W / Sekunden bei Leistung zwischen 2001W und 3000W
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT_0XDFB7 (RXBUF_UINT32(36))
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT_0XDFB7_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LEISTUNG_BEREICH_4_WERT_0XDFB7_TYPE unsigned long
// Seconds at power over 3000W / Sekunden bei Leistung über 3000W
#define I3_PID_KLE_LADEGERAET_LADEDAUER2 0xDFB8
// Information on the charging time for a second charger (multi-phase charging) / Information zur Ladedauer für
// ein zweites Ladegerät (mehrphasiges Laden)
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_WERT_0XDFB8 (RXBUF_UINT32(0))
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_WERT_0XDFB8_UNIT 'min'
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_WERT_0XDFB8_TYPE unsigned long
// Charging time in minutes / Ladezeit in Minuten
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_WERT_0XDFB8 (RXBUF_UINT(4))
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_WERT_0XDFB8_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_WERT_0XDFB8_TYPE unsigned short
// Loading time in seconds / Ladezeit in Sekunden
#define I3_RES_KLE_STAT_LADEZYKLEN_WERT_0XDFB8 (RXBUF_UINT(6))
#define I3_RES_KLE_STAT_LADEZYKLEN_WERT_0XDFB8_TYPE unsigned short
// Number of charging cycles / Anzahl der Ladezyklen
#define I3_PID_KLE_UMSCHALTMATRIX 0xDFB9
// Switching matrix (multi-phase charging): number of switching cycles and state of the switches / Umschaltmatrix
// (mehrphasiges Laden): Anzahl von Schaltzyklen und Zustand der Schalter
#define I3_RES_KLE_STAT_SCHALTER1_SCHALTZYKLEN_ANZAHL_WERT (RXBUF_UINT32(0))
#define I3_RES_KLE_STAT_SCHALTER1_SCHALTZYKLEN_ANZAHL_WERT_TYPE unsigned long
// Number of switching cycles for switch 1 (multi-phase charging: phase 1) / Anzahl von Schaltzyklen für Schalter
// 1 (mehrphasiges Laden: Phase 1)
#define I3_RES_KLE_STAT_SCHALTER2_SCHALTZYKLEN_ANZAHL_WERT (RXBUF_UINT32(4))
#define I3_RES_KLE_STAT_SCHALTER2_SCHALTZYKLEN_ANZAHL_WERT_TYPE unsigned long
// Number of switching cycles for switch 2 (multi-phase charging: phase 2) / Anzahl von Schaltzyklen für Schalter
// 2 (mehrphasiges Laden: Phase 2)
#define I3_RES_KLE_STAT_SCHALTER3_SCHALTZYKLEN_ANZAHL_WERT (RXBUF_UINT32(8))
#define I3_RES_KLE_STAT_SCHALTER3_SCHALTZYKLEN_ANZAHL_WERT_TYPE unsigned long
// Number of switching cycles for switch 3 (multi-phase charging: phase 3) / Anzahl von Schaltzyklen für Schalter
// 3 (mehrphasiges Laden: Phase 3)
#define I3_RES_KLE_STAT_SCHALTER4_SCHALTZYKLEN_ANZAHL_WERT (RXBUF_UINT32(12))
#define I3_RES_KLE_STAT_SCHALTER4_SCHALTZYKLEN_ANZAHL_WERT_TYPE unsigned long
// Number of switching cycles for switch 4 (multi-phase charging: changeover) / Anzahl von Schaltzyklen für
// Schalter 4 (mehrphasiges Laden: Umschaltung)
#define I3_RES_KLE_STAT_SCHALTER1 (RXBUF_UCHAR(16))
#define I3_RES_KLE_STAT_SCHALTER1_UNIT '0/1'
#define I3_RES_KLE_STAT_SCHALTER1_TYPE unsigned char
// State of switch 1 (0 = open, 1 = closed) / Zustand vom Schalter 1 (0= offen, 1=geschlossen)
#define I3_RES_KLE_STAT_SCHALTER2 (RXBUF_UCHAR(17))
#define I3_RES_KLE_STAT_SCHALTER2_UNIT '0/1'
#define I3_RES_KLE_STAT_SCHALTER2_TYPE unsigned char
// State of switch 2 (0 = open, 1 = closed) / Zustand vom Schalter 2 (0= offen, 1=geschlossen)
#define I3_RES_KLE_STAT_SCHALTER3 (RXBUF_UCHAR(18))
#define I3_RES_KLE_STAT_SCHALTER3_UNIT '0/1'
#define I3_RES_KLE_STAT_SCHALTER3_TYPE unsigned char
// State of switch 3 (0 = open, 1 = closed) / Zustand vom Schalter 3 (0= offen, 1=geschlossen)
#define I3_RES_KLE_STAT_SCHALTER4 (RXBUF_UCHAR(19))
#define I3_RES_KLE_STAT_SCHALTER4_UNIT '0/1'
#define I3_RES_KLE_STAT_SCHALTER4_TYPE unsigned char
// State of switch 4 (0 = charger 1, 1 = charger 2) / Zustand vom Schalter 4 (0= Ladegerät 1, 1=Ladegerät 2)
#define I3_PID_KLE_LADEGERAET_SPANNUNG2 0xDFBA
// AC and DC voltages for second charger (multi-phase charging) / AC und DC Spannungen für zweites Ladegerät
// (mehrphasiges Laden)
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_1_WERT_0XDFBA (RXBUF_UINT(0))
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_1_WERT_0XDFBA_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_1_WERT_0XDFBA_TYPE unsigned short
// RMS values of the AC conductor voltages (phase 1) / Effektivwerte der AC Leiterspannungen (Phase1)
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT_0XDFBA (RXBUF_UINT(2)/10.0f)
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT_0XDFBA_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_OBERGRENZE_WERT_0XDFBA_TYPE float
// HV DC voltage upper limit / HV DC Spannungsobergrenze
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_WERT_0XDFBA (RXBUF_UINT(4)/10.0f)
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_WERT_0XDFBA_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_DC_HV_WERT_0XDFBA_TYPE float
// HV DC voltage / HV DC Spannung
#define I3_RES_KLE_STAT_SPANNUNG_KL30_WERT_0XDFBA (RXBUF_UCHAR(6)/10.0f)
#define I3_RES_KLE_STAT_SPANNUNG_KL30_WERT_0XDFBA_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_KL30_WERT_0XDFBA_TYPE float
// KL30 voltage / KL30 Spannung
#define I3_RES_KLE_STAT_SPANNUNG_KL30C_WERT_0XDFBA (RXBUF_UCHAR(7)/10.0f)
#define I3_RES_KLE_STAT_SPANNUNG_KL30C_WERT_0XDFBA_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_KL30C_WERT_0XDFBA_TYPE float
// KL30C voltage / KL30C Spannung
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_2_WERT_0XDFBA (RXBUF_UINT(8))
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_2_WERT_0XDFBA_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_2_WERT_0XDFBA_TYPE unsigned short
// RMS values of the AC conductor voltages (phase 2) / Effektivwerte der AC Leiterspannungen (Phase 2)
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_3_WERT_0XDFBA (RXBUF_UINT(10))
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_3_WERT_0XDFBA_UNIT 'V'
#define I3_RES_KLE_STAT_SPANNUNG_RMS_AC_PHASE_3_WERT_0XDFBA_TYPE unsigned short
// RMS values of the AC conductor voltages (phase 3) / Effektivwerte der AC Leiterspannungen (Phase 3)
#define I3_PID_KLE_LADEGERAET_STROM2 0xDFBB
// Charger currents for second charger (multi-phase charging) / Ströme des Ladegeräts für zweits Ladegerät
// (mehrphasiges Laden)
#define I3_RES_KLE_STAT_STROM_AC_PHASE_1_WERT_0XDFBB (RXBUF_UINT(0)/10.0f)
#define I3_RES_KLE_STAT_STROM_AC_PHASE_1_WERT_0XDFBB_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_AC_PHASE_1_WERT_0XDFBB_TYPE float
// AC current phase 1 / AC Strom Phase 1
#define I3_RES_KLE_STAT_STROM_AC_MAX_GESPEICHERT_WERT_0XDFBB (RXBUF_UINT(2)/10.0f)
#define I3_RES_KLE_STAT_STROM_AC_MAX_GESPEICHERT_WERT_0XDFBB_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_AC_MAX_GESPEICHERT_WERT_0XDFBB_TYPE float
// Maximum stored AC current / Maximal gespeicherter AC Strom
#define I3_RES_KLE_STAT_STROM_HV_DC_WERT_0XDFBB (RXBUF_UINT(4)/10.0f-204.7)
#define I3_RES_KLE_STAT_STROM_HV_DC_WERT_0XDFBB_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_HV_DC_WERT_0XDFBB_TYPE float
// HV DC electricity / HV DC Strom
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_LIMIT_WERT_0XDFBB (RXBUF_UINT(6)/10.0f)
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_LIMIT_WERT_0XDFBB_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_LIMIT_WERT_0XDFBB_TYPE float
// Maximum permitted HV DC current / Maximal erlaubter HV DC Strom
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT_0XDFBB (RXBUF_UINT(8)/10.0f-204.7)
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT_0XDFBB_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_HV_DC_MAX_GESPEICHERT_WERT_0XDFBB_TYPE float
// Maximum stored DC current / Maximal gespeicherter DC Strom
#define I3_RES_KLE_STAT_STROM_AC_PHASE_2_WERT_0XDFBB (RXBUF_UINT(10)/10.0f)
#define I3_RES_KLE_STAT_STROM_AC_PHASE_2_WERT_0XDFBB_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_AC_PHASE_2_WERT_0XDFBB_TYPE float
// AC current phase 2 / AC Strom Phase 2
#define I3_RES_KLE_STAT_STROM_AC_PHASE_3_WERT_0XDFBB (RXBUF_UINT(12)/10.0f)
#define I3_RES_KLE_STAT_STROM_AC_PHASE_3_WERT_0XDFBB_UNIT 'A'
#define I3_RES_KLE_STAT_STROM_AC_PHASE_3_WERT_0XDFBB_TYPE float
// AC current phase 3 / AC Strom Phase 3
#define I3_PID_KLE_BETRIEBSZUSTAND_LADEGERAET2 0xDFBC
// Operating modes charger for second charger (multi-phase charging) / Betriebsarten Ladegerät für zweites
// Ladegerät (mehrphasiges Laden)
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_1_WERT_0XDFBC (RXBUF_UCHAR(0)/4.0f)
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_1_WERT_0XDFBC_UNIT 'Hz'
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_1_WERT_0XDFBC_TYPE float
// Current grid frequency phase 1 / Aktuelle Netzfrequenz Phase 1
// BF_LADEGERAET_DERATING_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
// Reason for derating / Grund für Derating
#define I3_RES_KLE_BF_LADEGERAET_DERATING_0XDFBC (RXBUF_UCHAR(1))
#define I3_RES_KLE_BF_LADEGERAET_DERATING_0XDFBC_UNIT 'Bit'
#define I3_RES_KLE_BF_LADEGERAET_DERATING_0XDFBC_TYPE unsigned char
// Reason for derating / Grund für Derating
#define I3_RES_KLE_STAT_LEISTUNG_DERATING_WERT_0XDFBC (RXBUF_UINT(2)*10.0f)
#define I3_RES_KLE_STAT_LEISTUNG_DERATING_WERT_0XDFBC_UNIT 'W'
#define I3_RES_KLE_STAT_LEISTUNG_DERATING_WERT_0XDFBC_TYPE float
// Derating performance / Derating Leistung
#define I3_RES_KLE_STAT_DERATING_WERT_0XDFBC (RXBUF_UCHAR(4))
#define I3_RES_KLE_STAT_DERATING_WERT_0XDFBC_UNIT '%'
#define I3_RES_KLE_STAT_DERATING_WERT_0XDFBC_TYPE unsigned char
// Derating / Derating
// BF_LADEGERAET_FEHLERZUSTAND_UCXII_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
// Charger fault conditions / Ladegerät Fehlerzustände
#define I3_RES_KLE_BF_LADEGERAET_FEHLERZUSTAND_UCXII_0XDFBC (RXBUF_UCHAR(5))
#define I3_RES_KLE_BF_LADEGERAET_FEHLERZUSTAND_UCXII_0XDFBC_UNIT 'Bit'
#define I3_RES_KLE_BF_LADEGERAET_FEHLERZUSTAND_UCXII_0XDFBC_TYPE unsigned char
// Charger fault conditions / Ladegerät Fehlerzustände
// BF_AUSLOESER_FAILSAFE_UCXII_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
// Failsafe trigger / Auslöser Failsafe
#define I3_RES_KLE_BF_AUSLOESER_FAILSAFE_UCXII_0XDFBC (RXBUF_UCHAR(6))
#define I3_RES_KLE_BF_AUSLOESER_FAILSAFE_UCXII_0XDFBC_UNIT 'Bit'
#define I3_RES_KLE_BF_AUSLOESER_FAILSAFE_UCXII_0XDFBC_TYPE unsigned char
// Failsafe trigger / Auslöser Failsafe
// BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
// Cause of charging interruption / Ursache für Ladeunterbrechung
#define I3_RES_KLE_BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_0XDFBC (RXBUF_UCHAR(7))
#define I3_RES_KLE_BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_0XDFBC_UNIT 'Bit'
#define I3_RES_KLE_BF_LADEGERAET_URSACHE_LADEUNTERBRECHUNG_0XDFBC_TYPE unsigned char
// Cause of charging interruption / Ursache für Ladeunterbrechung
#define I3_RES_KLE_STAT_BETRIEBSART_NR_0XDFBC (RXBUF_UCHAR(8))
#define I3_RES_KLE_STAT_BETRIEBSART_NR_0XDFBC_UNIT '0-n'
#define I3_RES_KLE_STAT_BETRIEBSART_NR_0XDFBC_TYPE unsigned char
// Operating mode / Betriebsart
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_2_WERT_0XDFBC (RXBUF_UCHAR(9)/4.0f)
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_2_WERT_0XDFBC_UNIT 'Hz'
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_2_WERT_0XDFBC_TYPE float
// Current grid frequency phase 2 / Aktuelle Netzfrequenz Phase 2
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_3_WERT_0XDFBC (RXBUF_UCHAR(10)/4.0f)
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_3_WERT_0XDFBC_UNIT 'Hz'
#define I3_RES_KLE_STAT_NETZFREQUENZ_PHASE_3_WERT_0XDFBC_TYPE float
// Current grid frequency phase 3 / Aktuelle Netzfrequenz Phase 3
// BF_MOD_ERR_0XDFBC is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***
// Error states load module / Fehlerzustände Lademodul
#define I3_RES_KLE_BF_MOD_ERR_0XDFBC (RXBUF_UCHAR(11))
#define I3_RES_KLE_BF_MOD_ERR_0XDFBC_UNIT 'Bit'
#define I3_RES_KLE_BF_MOD_ERR_0XDFBC_TYPE unsigned char
// Error states load module / Fehlerzustände Lademodul
#define I3_PID_KLE_LADEDAUER_LADEART 0xDFBD
// Charging time for different charging types / Ladedauer für verschiedene Ladearten
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_1PH_WERT (RXBUF_UINT32(0))
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_1PH_WERT_UNIT 'min'
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_1PH_WERT_TYPE unsigned long
// Charging time in minutes for single-phase charging / Ladezeit in Minuten für einphasiges Laden
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_1PH_WERT (RXBUF_UINT(4))
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_1PH_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_1PH_WERT_TYPE unsigned short
// Charging time in seconds for single-phase charging / Ladezeit in Sekunden für einphasiges Laden
#define I3_RES_KLE_STAT_LADEZYKLUS_1PH_WERT (RXBUF_UINT(6))
#define I3_RES_KLE_STAT_LADEZYKLUS_1PH_WERT_TYPE unsigned short
// Number of charging cycles, single-phase charging / Anzahl Ladezyklus einphasiges Laden
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_3PH_WERT (RXBUF_UINT32(8))
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_3PH_WERT_UNIT 'min'
#define I3_RES_KLE_STAT_MINUTEN_LADEZYKLUS_3PH_WERT_TYPE unsigned long
// Charging time in minutes for multi-phase charging / Ladezeit in Minuten für mehrphasiges Laden
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_3PH_WERT (RXBUF_UINT(12))
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_3PH_WERT_UNIT 's'
#define I3_RES_KLE_STAT_SEKUNDEN_LADEZYKLUS_3PH_WERT_TYPE unsigned short
// Charging time in seconds for multi-phase charging / Ladezeit in Sekunden für mehrphasiges Laden
#define I3_RES_KLE_STAT_LADEZYKLUS_3PH_WERT (RXBUF_UINT(14))
#define I3_RES_KLE_STAT_LADEZYKLUS_3PH_WERT_TYPE unsigned short
// Number of charging cycles, multi-phase charging / Anzahl Ladezyklus mehrphasiges Laden
#define I3_PID_KLE_FLASH_DSPS_0XF000 0xF000
// RID used to flash DSPs / RID used to flash DSPs
#define I3_RES_KLE_STAT_DSP_FLASHING_0XF000 (RXBUF_UCHAR(0))
#define I3_RES_KLE_STAT_DSP_FLASHING_0XF000_UNIT '0-n'
#define I3_RES_KLE_STAT_DSP_FLASHING_0XF000_TYPE unsigned char
// DSP programming status. / Status der DSP-Programmierung.

View File

@ -1,23 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/ucx2_i01.json: KLE 15: Convenience charging electronics
// This generated code makes it easier to process CANBUS messages from the KLE ecu in a BMW i3
//
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_FLASH_DSPS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAF43
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_BETRIEBSZUSTAND_LADEGERAET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE84
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_LEISTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE85
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_SPANNUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE86
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_STROM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE87
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_AC_PHASENANZAHL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF25
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_LADEDAUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB0
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_TEMPERATUREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB1
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_LEISTUNG2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB4
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_LADE_HISTOGRAMM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB6
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_LADE_HISTOGRAMM2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB7
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_LADEDAUER2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB8
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_UMSCHALTMATRIX, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFB9
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_SPANNUNG2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFBA
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEGERAET_STROM2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFBB
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_BETRIEBSZUSTAND_LADEGERAET2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFBC
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_LADEDAUER_LADEART, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFBD
//{ I3_ECU_KLE_TX, I3_ECU_KLE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KLE_FLASH_DSPS_0XF000, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF000

View File

@ -1,75 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/komb25.json: KOM 60: Instrument panel
// This generated code makes it easier to process CANBUS messages from the KOM ecu in a BMW i3
//
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_SELBSTTEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x0F04
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_START_SYSTIME, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1005
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_STATUS_SYSTIME, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1725
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_STATUS_AKT_AUSFALL_CCMS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x2521
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_SELBSTTEST_HUD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA104
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_AO_TOTAL_TIME_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA108
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_SHOWMODE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAA00
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_LOGBUCH_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAA01
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_DREHZAHL_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD106
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_TACHO_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD107
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_GWSZ_ABSOLUT_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD10D
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_LSS_TASTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD10E
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_KOMBI_REICHWEITE_BEV_PHEV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD111
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_A_TEMP_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD112
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_KOMBI_UHRZEIT_DATUM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD113
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_GWSZ_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD114
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_STARTWERT_ZEITEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD118
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_TANKINHALT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD11F
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_TIMER_KLIMATISIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD121
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_ZEITSTEMPEL_HU_ABFRAGEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD12C
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_SEGMENTDATEN_SPEICHER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD12F
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_REICHWEITE_GEWONNENER_KRAFTSTOFF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D0
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCHSERHOEHUNG_ALPHA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D1
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCHSERHOEHUNG_PI, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D2
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_MEHRVERBRAUCH_MV_REF, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D3
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_ECO_MODE_AUSTRITT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D4
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAEUCHE_SKALIERUNG_X, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D5
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAEUCHE_SKALIERUNG_Y, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D6
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAEUCHE_SKALIERUNG_Z, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D7
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAEUCHE_SKALIERUNG_A, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D8
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCHSVORTEIL_HYBRID_AKT_SEGMENT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1D9
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_KOMBI_HUD_AKTIVE_WARPLISTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA00
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_STATUS_HUD_BILDPOSITION_SCHRITTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA0A
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_STATUS_HUD_BILDROTATION_SCHRITTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA0F
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_PORTS_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA43
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_SW_VERSION_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA44
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_SENSOREN_IDENT_LESEN_ERWEITERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA46
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_KOMBI_HUD_BILDPOSITION_STUFEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDA47
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_REICHWEITE_GEWONNENER_KRAFTSTOFF_0X4200, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4200
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCHSERHOEHUNG_ALPHA_0X4201, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4201
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCHSERHOEHUNG_PI_0X4202, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4202
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_MEHRVERBRAUCH_MV_REF_0X4203, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4203
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_ECO_MODE_AUSTRITT_0X4204, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4204
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAEUCHE_SKALIERUNG_X_0X4205, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4205
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAEUCHE_SKALIERUNG_Y_0X4206, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4206
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAEUCHE_SKALIERUNG_Z_0X4207, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4207
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAEUCHE_SKALIERUNG_A_0X4208, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4208
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCHSVORTEIL_HYBRID_AKT_SEGMENT_0X4209, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4209
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERVRAEUCHE_SKALIERUNG_MCV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x420A
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCHSVORTEIL_HYBRID_AKT_SEGMENT_MCV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x420B
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_REICHWEITE_MCV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x420C
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCH_ERHOEHUNG_A, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x420D
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCH_ERHOEHUNG_TT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x420E
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_MEHRVERBRAUCH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x420F
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_ECO_MODE_AUSTRITT_0X4210, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4210
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCH_CHARAKTERISTIK_ECO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4230
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCH_CHARAKTERISTIK_NORMAL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4231
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCH_CHARAKTERISTIK_LERNFAKTOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4232
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_VERBRAUCH_CHARAKTERISTIK_FAKTOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4233
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_LOGBUCH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4800
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_PIA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4801
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_NO_SIGNAL_SCREEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4803
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_START_UP_SCREEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4804
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_PROCESS_VERSION_READ, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4805
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_KOMBI_BC_BCW_L_KM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD126
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_KOMBI_BC_RBC_L_KM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD127
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_KOMBI_BC_BCW_KWH_KM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD129
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_KOMBI_BC_RBC_KWH_KM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD12A
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_CC_MELDUNGSSPEICHER_LOESCHEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF010
//{ I3_ECU_KOM_TX, I3_ECU_KOM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_KOM_HUD_M_SHOWMODE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF018

View File

@ -1,199 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/lim_i1.json: LIM 14: Charging interface module
// This generated code makes it easier to process CANBUS messages from the LIM ecu in a BMW i3
//
case I3_PID_LIM_STATUS_CALCVN: { // 0x2541
if (datalen < 20) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_STATUS_CALCVN", 20);
break;
}
unsigned long STAT_CVN_WERT = (RXBUF_UINT32(16));
// Read out CVN (here the CVN must be output as in mode $ 09 (PID $ 06)) / CVN auslesen (hier muss die CVN wie
// bei Mode $09 (PID $06) ausgegeben werden)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "LIM", "STATUS_CALCVN", "STAT_CVN_WERT", STAT_CVN_WERT, "\"HEX\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_LIM_LADESTECKDOSE_TEMPERATUR: { // 0xDB0F
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_LADESTECKDOSE_TEMPERATUR", 2);
break;
}
float STAT_LADESTECKDOSE_TEMP_WERT = (RXBUF_UINT(0)/10.0f-40.0);
// Temperature of the DC charging connection in ° C (China) / Temperatur der DC-Ladeanschluss in °C (China)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "LIM", "LADESTECKDOSE_TEMPERATUR", "STAT_LADESTECKDOSE_TEMP_WERT", STAT_LADESTECKDOSE_TEMP_WERT, "\"°C\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_LIM_LADEBEREITSCHAFT_LIM: { // 0xDEF2
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_LADEBEREITSCHAFT_LIM", 1);
break;
}
unsigned char STAT_LADEBEREITSCHAFT_LIM = (RXBUF_UCHAR(0));
// Ready to charge (HW line), (1 = yes, 0 = no) sent from LIM to SLE / Ladebereitschaft (HW-Leitung), (1 = ja, 0
// = nein) vom LIM an SLE gesendet
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "LADEBEREITSCHAFT_LIM", "STAT_LADEBEREITSCHAFT_LIM", STAT_LADEBEREITSCHAFT_LIM, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_LIM_PROXIMITY: { // 0xDEF5
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_PROXIMITY", 2);
break;
}
unsigned char STAT_STECKER_NR = (RXBUF_UCHAR(0));
// Condition of the plug / Zustand des Steckers
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "PROXIMITY", "STAT_STECKER_NR", STAT_STECKER_NR, "\"0-n\"");
unsigned char STAT_STROMTRAGFAEHIGKEIT_WERT = (RXBUF_UCHAR(1));
// Current carrying capacity of the connected cable / Stromtragfähigkeit des angeschlossenen Kabels
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "PROXIMITY", "STAT_STROMTRAGFAEHIGKEIT_WERT", STAT_STROMTRAGFAEHIGKEIT_WERT, "\"A\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_LIM_PILOTSIGNAL: { // 0xDEF6
if (datalen < 7) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_PILOTSIGNAL", 7);
break;
}
unsigned char STAT_PILOT_AKTIV = (RXBUF_UCHAR(0));
// State of the pilot signal (0 = not active, 1 = active) / Zustand des Pilotsignals (0 = nicht aktiv, 1 = aktiv)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "PILOTSIGNAL", "STAT_PILOT_AKTIV", STAT_PILOT_AKTIV, "\"0/1\"");
unsigned char STAT_PILOT_PWM_DUTYCYCLE_WERT = (RXBUF_UCHAR(1));
// Pulse duty factor PWM pilot signal / Tastverhältnis PWM Pilotsignal
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "PILOTSIGNAL", "STAT_PILOT_PWM_DUTYCYCLE_WERT", STAT_PILOT_PWM_DUTYCYCLE_WERT, "\"%\"");
unsigned char STAT_PILOT_CURRENT_WERT = (RXBUF_UCHAR(2));
// Current value calculated from the pilot signal / Errechneter Stromwert aus Pilotsignal
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "PILOTSIGNAL", "STAT_PILOT_CURRENT_WERT", STAT_PILOT_CURRENT_WERT, "\"A\"");
unsigned char STAT_PILOT_LADEBEREIT = (RXBUF_UCHAR(3));
// Vehicle ready to charge state (0 = not ready to charge, 1 = ready to charge) / Zustand Ladebereitschaft
// Fahrzeug (0 = nicht ladebereit, 1 = ladebereit)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "PILOTSIGNAL", "STAT_PILOT_LADEBEREIT", STAT_PILOT_LADEBEREIT, "\"0/1\"");
unsigned short STAT_PILOT_FREQUENZ_WERT = (RXBUF_UINT(4));
// Frequency of the pilot signal / Frequenz des Pilotsignals
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "LIM", "PILOTSIGNAL", "STAT_PILOT_FREQUENZ_WERT", STAT_PILOT_FREQUENZ_WERT, "\"Hz\"");
float STAT_PILOT_PEGEL_WERT = (RXBUF_UCHAR(6)/10.0f);
// Pilot signal level / Pegel des Pilotsignals
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "LIM", "PILOTSIGNAL", "STAT_PILOT_PEGEL_WERT", STAT_PILOT_PEGEL_WERT, "\"V\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_LIM_LADESCHNITTSTELLE_DC_TEPCO: { // 0xDEF7
if (datalen < 4) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_LADESCHNITTSTELLE_DC_TEPCO", 4);
break;
}
unsigned char STAT_CHARGE_CONTROL_1 = (RXBUF_UCHAR(0));
// Charge control status 1 line (0 = not active, 1 = active) / Zustand Charge control 1 Leitung (0 = nicht aktiv,
// 1 = aktiv)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "LADESCHNITTSTELLE_DC_TEPCO", "STAT_CHARGE_CONTROL_1", STAT_CHARGE_CONTROL_1, "\"0/1\"");
unsigned char STAT_CHARGE_CONTROL_2 = (RXBUF_UCHAR(1));
// Charge control status 2 line (0 = not active, 1 = active) / Zustand Charge control 2 Leitung (0 = nicht aktiv,
// 1 = aktiv)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "LADESCHNITTSTELLE_DC_TEPCO", "STAT_CHARGE_CONTROL_2", STAT_CHARGE_CONTROL_2, "\"0/1\"");
unsigned char STAT_CHARGE_PERMISSION = (RXBUF_UCHAR(2));
// Charge permission line status (0 = not active, 1 = active) / Zustand Charge Permission Leitung (0 = nicht
// aktiv, 1 = aktiv)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "LADESCHNITTSTELLE_DC_TEPCO", "STAT_CHARGE_PERMISSION", STAT_CHARGE_PERMISSION, "\"0/1\"");
unsigned char STAT_LADESTECKER = (RXBUF_UCHAR(3));
// State of charging plug (0 = not plugged in, 1 = plugged in) / Zustand Ladestecker (0 = nicht gesteckt, 1 =
// gesteckt)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "LADESCHNITTSTELLE_DC_TEPCO", "STAT_LADESTECKER", STAT_LADESTECKER, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_LIM_DC_SCHUETZ_SCHALTER: { // 0xDEF8
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_DC_SCHUETZ_SCHALTER", 1);
break;
}
unsigned char STAT_DC_SCHUETZ_SCHALTER = (RXBUF_UCHAR(0));
// Contactor switch status (DC charging) / Status Schützschalter (DC-Laden)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "DC_SCHUETZ_SCHALTER", "STAT_DC_SCHUETZ_SCHALTER", STAT_DC_SCHUETZ_SCHALTER, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_LIM_DC_SCHUETZ_SPANNUNG_EINGANG: { // 0xDEF9
if (datalen < 3) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_DC_SCHUETZ_SPANNUNG_EINGANG", 3);
break;
}
unsigned short STAT_DC_SCHUETZ_SPANNUNG_EINGANG_WERT = (RXBUF_UINT(0));
// Voltage at the input of the relay box (contactors) for DC charging / Spannung am Eingang der Relaisbox
// (Schaltschütze) für DC-Laden
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "LIM", "DC_SCHUETZ_SPANNUNG_EINGANG", "STAT_DC_SCHUETZ_SPANNUNG_EINGANG_WERT", STAT_DC_SCHUETZ_SPANNUNG_EINGANG_WERT, "\"V\"");
unsigned char STAT_DC_SCHUETZ_SPANNUNG_NEGATIV = (RXBUF_UCHAR(2));
// Detection of a negative voltage (0 = no or positive voltage / 1 = negative voltage) / Erkennung einer
// negativen Spannung (0 = keine oder positive Spannung / 1 = negative Spannung)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "DC_SCHUETZ_SPANNUNG_EINGANG", "STAT_DC_SCHUETZ_SPANNUNG_NEGATIV", STAT_DC_SCHUETZ_SPANNUNG_NEGATIV, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_LIM_DC_PINABDECKUNG_COMBO: { // 0xDEFA
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_LIM_DC_PINABDECKUNG_COMBO", 1);
break;
}
unsigned char STAT_DC_PINABDECKUNG = (RXBUF_UCHAR(0));
// State of the DC pin cover for combo socket (0 = closed, 1 = open) / Zustand der DC Pinabdeckung bei
// Combo-Steckdose (0 = geschlossen, 1 = geöffnet)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "LIM", "DC_PINABDECKUNG_COMBO", "STAT_DC_PINABDECKUNG", STAT_DC_PINABDECKUNG, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}

View File

@ -1,163 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/lim_i1.json: LIM 14: Charging interface module
// This generated code makes it easier to process CANBUS messages from the LIM ecu in a BMW i3
//
#define I3_ECU_LIM_TX 0x06F114
#define I3_ECU_LIM_RX 0x0614F1
#define I3_PID_LIM_STATUS_CALCVN 0x2541
// Read out Cal-ID (Calibration-ID) and CVN (Calibration Verification Number). (OBD scopes) Byte layout: 20 bytes
// long 00-15 = STAT_CALID_WERT 16-19 = STAT_CVN_EINH as Hex unit32 in Intel format / Cal-ID (Calibration-ID) und
// CVN(Calibration Verification Number) auslesen. (OBD-Umfänge) Byte-Layout: 20 Byte lang 00-15 =
// STAT_CALID_WERT 16-19 = STAT_CVN_EINH als Hex unit32 im Intel Format
// Can't yet generate code for STAT_CALID_TEXT of type string[16], at offset 0. But we account for the 16 bytes
// Read out Cal ID (here the Cal ID must be output as in mode $ 09 (PID $ 04)) / Cal-ID auslesen (hier muss die
// Cal-ID wie bei Mode $09 (PID $04) ausgegeben werden).
#define I3_RES_LIM_STAT_CVN_WERT (RXBUF_UINT32(16))
#define I3_RES_LIM_STAT_CVN_WERT_UNIT 'HEX'
#define I3_RES_LIM_STAT_CVN_WERT_TYPE unsigned long
// Read out CVN (here the CVN must be output as in mode $ 09 (PID $ 06)) / CVN auslesen (hier muss die CVN wie
// bei Mode $09 (PID $06) ausgegeben werden)
// Skipping ZV_LADESTECKER_CN on 0xDB0E which takes arguments
#define I3_PID_LIM_LADESTECKDOSE_TEMPERATUR 0xDB0F
// Temperature of the DC charging connection in ° C (China) / Temperatur der DC-Ladeanschluss in °C (China)
#define I3_RES_LIM_STAT_LADESTECKDOSE_TEMP_WERT (RXBUF_UINT(0)/10.0f-40.0)
#define I3_RES_LIM_STAT_LADESTECKDOSE_TEMP_WERT_UNIT '°C'
#define I3_RES_LIM_STAT_LADESTECKDOSE_TEMP_WERT_TYPE float
// Temperature of the DC charging connection in ° C (China) / Temperatur der DC-Ladeanschluss in °C (China)
// Skipping LADEN_HOSPITALITY_FUNKTION on 0xDE6B which takes arguments
// Skipping ZV_LADESTECKER on 0xDEF0 which takes arguments
// Skipping ZV_LADEKLAPPE on 0xDEF1 which takes arguments
#define I3_PID_LIM_LADEBEREITSCHAFT_LIM 0xDEF2
// Ready to charge (HW line), (1 = yes, 0 = no) sent from LIM to SLE / Ladebereitschaft (HW-Leitung), (1 = ja, 0
// = nein) vom LIM an SLE gesendet
#define I3_RES_LIM_STAT_LADEBEREITSCHAFT_LIM (RXBUF_UCHAR(0))
#define I3_RES_LIM_STAT_LADEBEREITSCHAFT_LIM_UNIT '0/1'
#define I3_RES_LIM_STAT_LADEBEREITSCHAFT_LIM_TYPE unsigned char
// Ready to charge (HW line), (1 = yes, 0 = no) sent from LIM to SLE / Ladebereitschaft (HW-Leitung), (1 = ja, 0
// = nein) vom LIM an SLE gesendet
// Skipping LED_LADESTATUS on 0xDEF3 which takes arguments
// Skipping LED_SUCHBELEUCHTUNG on 0xDEF4 which takes arguments
#define I3_PID_LIM_PROXIMITY 0xDEF5
// Current status of the proximity / Aktueller Zustand des Proximity
#define I3_RES_LIM_STAT_STECKER_NR (RXBUF_UCHAR(0))
#define I3_RES_LIM_STAT_STECKER_NR_UNIT '0-n'
#define I3_RES_LIM_STAT_STECKER_NR_TYPE unsigned char
// Condition of the plug / Zustand des Steckers
#define I3_RES_LIM_STAT_STROMTRAGFAEHIGKEIT_WERT (RXBUF_UCHAR(1))
#define I3_RES_LIM_STAT_STROMTRAGFAEHIGKEIT_WERT_UNIT 'A'
#define I3_RES_LIM_STAT_STROMTRAGFAEHIGKEIT_WERT_TYPE unsigned char
// Current carrying capacity of the connected cable / Stromtragfähigkeit des angeschlossenen Kabels
#define I3_PID_LIM_PILOTSIGNAL 0xDEF6
// current data of the pilot signal about the charging current / aktuelle Daten des Pilotsignals über den
// Ladestrom
#define I3_RES_LIM_STAT_PILOT_AKTIV (RXBUF_UCHAR(0))
#define I3_RES_LIM_STAT_PILOT_AKTIV_UNIT '0/1'
#define I3_RES_LIM_STAT_PILOT_AKTIV_TYPE unsigned char
// State of the pilot signal (0 = not active, 1 = active) / Zustand des Pilotsignals (0 = nicht aktiv, 1 = aktiv)
#define I3_RES_LIM_STAT_PILOT_PWM_DUTYCYCLE_WERT (RXBUF_UCHAR(1))
#define I3_RES_LIM_STAT_PILOT_PWM_DUTYCYCLE_WERT_UNIT '%'
#define I3_RES_LIM_STAT_PILOT_PWM_DUTYCYCLE_WERT_TYPE unsigned char
// Pulse duty factor PWM pilot signal / Tastverhältnis PWM Pilotsignal
#define I3_RES_LIM_STAT_PILOT_CURRENT_WERT (RXBUF_UCHAR(2))
#define I3_RES_LIM_STAT_PILOT_CURRENT_WERT_UNIT 'A'
#define I3_RES_LIM_STAT_PILOT_CURRENT_WERT_TYPE unsigned char
// Current value calculated from the pilot signal / Errechneter Stromwert aus Pilotsignal
#define I3_RES_LIM_STAT_PILOT_LADEBEREIT (RXBUF_UCHAR(3))
#define I3_RES_LIM_STAT_PILOT_LADEBEREIT_UNIT '0/1'
#define I3_RES_LIM_STAT_PILOT_LADEBEREIT_TYPE unsigned char
// Vehicle ready to charge state (0 = not ready to charge, 1 = ready to charge) / Zustand Ladebereitschaft
// Fahrzeug (0 = nicht ladebereit, 1 = ladebereit)
#define I3_RES_LIM_STAT_PILOT_FREQUENZ_WERT (RXBUF_UINT(4))
#define I3_RES_LIM_STAT_PILOT_FREQUENZ_WERT_UNIT 'Hz'
#define I3_RES_LIM_STAT_PILOT_FREQUENZ_WERT_TYPE unsigned short
// Frequency of the pilot signal / Frequenz des Pilotsignals
#define I3_RES_LIM_STAT_PILOT_PEGEL_WERT (RXBUF_UCHAR(6)/10.0f)
#define I3_RES_LIM_STAT_PILOT_PEGEL_WERT_UNIT 'V'
#define I3_RES_LIM_STAT_PILOT_PEGEL_WERT_TYPE float
// Pilot signal level / Pegel des Pilotsignals
#define I3_PID_LIM_LADESCHNITTSTELLE_DC_TEPCO 0xDEF7
// Status of the batch control lines / Status der Chargecontroll Leitungen
#define I3_RES_LIM_STAT_CHARGE_CONTROL_1 (RXBUF_UCHAR(0))
#define I3_RES_LIM_STAT_CHARGE_CONTROL_1_UNIT '0/1'
#define I3_RES_LIM_STAT_CHARGE_CONTROL_1_TYPE unsigned char
// Charge control status 1 line (0 = not active, 1 = active) / Zustand Charge control 1 Leitung (0 = nicht aktiv,
// 1 = aktiv)
#define I3_RES_LIM_STAT_CHARGE_CONTROL_2 (RXBUF_UCHAR(1))
#define I3_RES_LIM_STAT_CHARGE_CONTROL_2_UNIT '0/1'
#define I3_RES_LIM_STAT_CHARGE_CONTROL_2_TYPE unsigned char
// Charge control status 2 line (0 = not active, 1 = active) / Zustand Charge control 2 Leitung (0 = nicht aktiv,
// 1 = aktiv)
#define I3_RES_LIM_STAT_CHARGE_PERMISSION (RXBUF_UCHAR(2))
#define I3_RES_LIM_STAT_CHARGE_PERMISSION_UNIT '0/1'
#define I3_RES_LIM_STAT_CHARGE_PERMISSION_TYPE unsigned char
// Charge permission line status (0 = not active, 1 = active) / Zustand Charge Permission Leitung (0 = nicht
// aktiv, 1 = aktiv)
#define I3_RES_LIM_STAT_LADESTECKER (RXBUF_UCHAR(3))
#define I3_RES_LIM_STAT_LADESTECKER_UNIT '0/1'
#define I3_RES_LIM_STAT_LADESTECKER_TYPE unsigned char
// State of charging plug (0 = not plugged in, 1 = plugged in) / Zustand Ladestecker (0 = nicht gesteckt, 1 =
// gesteckt)
#define I3_PID_LIM_DC_SCHUETZ_SCHALTER 0xDEF8
// Contactor switch status (DC charging) / Status Schützschalter (DC-Laden)
#define I3_RES_LIM_STAT_DC_SCHUETZ_SCHALTER (RXBUF_UCHAR(0))
#define I3_RES_LIM_STAT_DC_SCHUETZ_SCHALTER_UNIT '0-n'
#define I3_RES_LIM_STAT_DC_SCHUETZ_SCHALTER_TYPE unsigned char
// Contactor switch status (DC charging) / Status Schützschalter (DC-Laden)
#define I3_PID_LIM_DC_SCHUETZ_SPANNUNG_EINGANG 0xDEF9
// Voltage at the input of the relay box (contactors) for DC charging / Spannung am Eingang der Relaisbox
// (Schaltschütze) für DC-Laden
#define I3_RES_LIM_STAT_DC_SCHUETZ_SPANNUNG_EINGANG_WERT (RXBUF_UINT(0))
#define I3_RES_LIM_STAT_DC_SCHUETZ_SPANNUNG_EINGANG_WERT_UNIT 'V'
#define I3_RES_LIM_STAT_DC_SCHUETZ_SPANNUNG_EINGANG_WERT_TYPE unsigned short
// Voltage at the input of the relay box (contactors) for DC charging / Spannung am Eingang der Relaisbox
// (Schaltschütze) für DC-Laden
#define I3_RES_LIM_STAT_DC_SCHUETZ_SPANNUNG_NEGATIV (RXBUF_UCHAR(2))
#define I3_RES_LIM_STAT_DC_SCHUETZ_SPANNUNG_NEGATIV_UNIT '0/1'
#define I3_RES_LIM_STAT_DC_SCHUETZ_SPANNUNG_NEGATIV_TYPE unsigned char
// Detection of a negative voltage (0 = no or positive voltage / 1 = negative voltage) / Erkennung einer
// negativen Spannung (0 = keine oder positive Spannung / 1 = negative Spannung)
#define I3_PID_LIM_DC_PINABDECKUNG_COMBO 0xDEFA
// State of the DC pin cover for combo socket (0 = closed, 1 = open) / Zustand der DC Pinabdeckung bei
// Combo-Steckdose (0 = geschlossen, 1 = geöffnet)
#define I3_RES_LIM_STAT_DC_PINABDECKUNG (RXBUF_UCHAR(0))
#define I3_RES_LIM_STAT_DC_PINABDECKUNG_UNIT '0/1'
#define I3_RES_LIM_STAT_DC_PINABDECKUNG_TYPE unsigned char
// State of the DC pin cover for combo socket (0 = closed, 1 = open) / Zustand der DC Pinabdeckung bei
// Combo-Steckdose (0 = geschlossen, 1 = geöffnet)

View File

@ -1,38 +0,0 @@
// -------- LIM (Charger port) --------------------------------------------------------------------------------------
#define I3_PID_LIM_STATUS_LADEKLAPPE 0xDEF1
// Status of the charging door
#define I3_RES_LIM_STAT_LADEKLAPPE (RXBUF_UINT(0))
#define I3_RES_LIM_STAT_LADEKLAPPE_UNIT ''
#define I3_RES_LIM_STAT_LADEKLAPPE_TYPE unsigned short
// POLL line
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_STATUS_LADEKLAPPE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF1
#define I3_PID_LIM_STATUS_LADESTECKER 0xDEF0
// "Status sensor AC connector lock front (0 = unlocked, 1 = locked)
#define I3_RES_LIM_STAT_LADESTECKER_0XDEFO (RXBUF_UCHAR(0))
#define I3_RES_LIM_STAT_LADESTECKER_0XDEFO_UNIT ''
#define I3_RES_LIM_STAT_LADESTECKER_0XDEFO_TYPE unsigned char
// POLL line
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_STATUS_LADESTECKER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF0
#define I3_PID_LIM_LED_LADESTATUS 0xDEF3
// Status or control LED for charging status (RGB light ring)
#define I3_RES_LIM_LED_LADESTATUS (RXBUF_UCHAR(0))
#define I3_RES_LIM_LED_LADESTATUS_UNIT ''
#define I3_RES_LIM_LED_LADESTATUS_TYPE unsigned char
// POLL line
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_LED_LADESTATUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF3

View File

@ -1,14 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/lim_i1.json: LIM 14: Charging interface module
// This generated code makes it easier to process CANBUS messages from the LIM ecu in a BMW i3
//
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_STATUS_CALCVN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x2541
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_LADESTECKDOSE_TEMPERATUR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDB0F
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_LADEBEREITSCHAFT_LIM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF2
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_PROXIMITY, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF5
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_PILOTSIGNAL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF6
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_LADESCHNITTSTELLE_DC_TEPCO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF7
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_DC_SCHUETZ_SCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF8
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_DC_SCHUETZ_SPANNUNG_EINGANG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEF9
//{ I3_ECU_LIM_TX, I3_ECU_LIM_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_LIM_DC_PINABDECKUNG_COMBO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDEFA

View File

@ -1,115 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/nbtevo.json: NBT 63: Headunit high
// This generated code makes it easier to process CANBUS messages from the NBT ecu in a BMW i3
//
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_RESET_AKTIVIERUNGSLEITUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1024
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ETH_PHY_SWITCH_ENGINE_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1044
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ETH_RESET_PORT_CONFIGURATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x104A
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ETH_RESET_PORT_TX_RX_STATS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x104B
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_LIFECYCLE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1735
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ETH_GET_NUMBER_OF_PORTS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1800
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ETH_PHY_LINK_STATE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1802
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ETH_LEARN_PORT_CONFIGURATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x1803
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STEUERN_VOLUMEAUDIO_DEFAULT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA002
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STEUERN_LINEAR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA004
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_FIND_BEST_STATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA00A
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STEUERN_INTERNAL_RESET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA023
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_PROVISIONING, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA02F
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STEUERN_DELETE_COOKIES, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA030
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STEUERN_RESCUE_MODE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA03B
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_SDARS_FACTORY_DEFAULTS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA03D
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_FIND_BEST_STATION_DAB, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA03F
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_FIND_BEST_TMC_STATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA045
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STEUERN_BT_DELETE_ALL_PHONE_ID, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA04B
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_INITIALISATION_COUNTER_REGION_CODE_DVD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA04D
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_SWUP_REMOVE_CUSTOMER_UPDATES, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA05A
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STEUERN_CLEAR_FAULT_TRACKING, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA085
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_TDA_AKTIVIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA0A8
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_UPDATE_ZERTIFIKATE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA0A9
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_TELNET_ZUGANG_AUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA0B0
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_WLAN_WPS_PUSH_BUTTON, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA0BB
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_HU_VIN_PROTECTION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA0F6
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_HU_FSC_REFURBISH_UI, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA0F7
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_HU_FSC_REFURBISH_VIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA0FB
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_HU_VIN_PROTECTION_ENFORCE_CYCLIC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xA109
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_LESEN_SYSTEMAUDIO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD002
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_INITIALISIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD004
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_DRIVE_HDD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD007
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_MEMORY_USAGE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD00A
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_VERSION_ID_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD00B
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_LESEN_LAUFWERK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD00C
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_ANT_QFS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD010
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SGBMID_NAVIMAP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD012
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_SER_NR_DOM_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD019
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_BT_GEKOPPELTE_GERAETE_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD01D
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SWUP_INSTALLATION_HISTORY, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD01E
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_LOGISTIC_NR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD020
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_APPLICATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD021
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_ANALOG_TEMPERATUR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD026
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_CD_MD_CDC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD02C
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SPEED, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD030
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_DIRECTION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD031
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_GPS_DILUTION_OF_POSITION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD032
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_GPS_SATINFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD034
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_GPS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD038
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_GPS_RECEIVER_SW_VERSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD03B
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_MAPMATERIAL_VERSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD03C
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_NAVI_CALIBRATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD03D
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_EXT_GYROSIGNAL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD03E
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_HMI_VERSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD03F
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SGBMID_GRACENOTES, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD042
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_ANT_QFS_FM2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD045
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SIGNAL_DAB, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD053
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_USB_HUB_TEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD057
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_ROUTE_DOWNLOAD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD065
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_ADAS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD067
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_TDA_AKTIVIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD091
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_TIME_AFTER_STARTUP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD092
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_FM_PHASDIV_ANTENNA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD093
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_BT_FIRMWARE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD095
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_HD_DECODER_FIRMWARE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0B8
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ABLAUF_ZERTIFIKAT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0B9
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_COOKIES, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0BA
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_COUNTER_FILES_MUSICDB, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0C1
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ZIN_CENTRAL_INSTRUMENT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0C9
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ZIN_EVENT_QUEUE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0CA
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_ZIN_INTERNAL_STATES, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0CB
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_PROVISIONING_PARAMETER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0CE
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_MEDIA_STATISTIK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0D1
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_PROVISIONING_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0D3
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_LAST_DESTINATIONS_FIRST_DATA_SET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0D6
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SDARS_RADIO_ID, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0DA
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_SDARS_VERSIONS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0DD
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SDARS_SIGNAL_QUALITY_SXM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0DF
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_LAST_DESTINATIONS_SECOND_DATA_SET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0E0
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_DRIVE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0E2
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_BORDERLINE_SETTING, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0E5
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_BORDERLINE_CHANGE_MODE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0E8
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SDARS_PELLET_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0E9
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_PROVISIONING_FORMAT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD0EB
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_WLAN_AUSSTATTUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1FA
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_WLAN_DEVICELIST_WIFI_DIRECT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD1FC
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_USB_TEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD207
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_WLAN_AP_NETWORK, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD20E
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_TOUCH_COMMAND_NUMBER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD26A
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_CID_PHOTOSENSOR, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5CB
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_CID_TEMP_BACKLIGHT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5CC
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_CID_HELLIGKEIT_SOLLWERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5CD
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_CID_HELLIGKEIT_ISTWERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5CE
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_CID_EINGANGSWERTE_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5CF
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_CID_VERBINDUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5D0
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_CID_DETAIL_INFORMATIONEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD5D4
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_EQDATA_FILENAME, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4008
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_SENSOR_WERTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x400A
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_CID_SW_VERSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x400E
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_INTERNAL_STATES, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x400F
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_CID_CODIERDATEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4010
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_STATUS_CID_DETAIL_INFORMATION_EXTENDED, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4011
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_WLAN_SIGNAL_TEST_AP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4044
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT_WLAN_SIGNAL_TEST_WIFI_DIRECT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4045
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT__STEUERN_DELETE_PERSISTENCY_JACINTO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xFDE1
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT__STEUERN_DELETE_PERSISTENCY_INTEL_PLUS_SWT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xFDE2
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT__STEUERN_DELETE_PERSISTENCY_INTEL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xFDE3
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT__STEUERN_BACKUP_PERSISTENCY, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xFDE5
//{ I3_ECU_NBT_TX, I3_ECU_NBT_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_NBT__STEUERN_RESTORE_PERSISTENCY, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xFDE6

View File

@ -1,209 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/sas_i1.json: SAS 22: Optional equipment system
// This generated code makes it easier to process CANBUS messages from the SAS ecu in a BMW i3
//
case I3_PID_SAS_LERNDATEN_RUECKSETZEN: { // 0xABC9
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_SAS_VDC0_LESEN: { // 0xD817
if (datalen < 29) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_SAS_VDC0_LESEN", 29);
break;
}
unsigned short STAT_VDC_SOLLSTROM_VL_WERT = (RXBUF_UINT(0));
// Target current of the VDC channel in the front left / Sollstrom des VDC Kanals vorne links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_SOLLSTROM_VL_WERT", STAT_VDC_SOLLSTROM_VL_WERT, "\"mA\"");
unsigned short STAT_VDC_SOLLSTROM_VR_WERT = (RXBUF_UINT(2));
// Target current of the VDC channel in the front right / Sollstrom des VDC Kanals vorne rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_SOLLSTROM_VR_WERT", STAT_VDC_SOLLSTROM_VR_WERT, "\"mA\"");
unsigned short STAT_VDC_SOLLSTROM_HL_WERT = (RXBUF_UINT(4));
// Target current of the VDC channel at the rear left / Sollstrom des VDC Kanals hinten links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_SOLLSTROM_HL_WERT", STAT_VDC_SOLLSTROM_HL_WERT, "\"mA\"");
unsigned short STAT_VDC_SOLLSTROM_HR_WERT = (RXBUF_UINT(6));
// Set current of the VDC channel at the rear right / Sollstrom des VDC Kanals hinten rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_SOLLSTROM_HR_WERT", STAT_VDC_SOLLSTROM_HR_WERT, "\"mA\"");
unsigned short STAT_VDC_ISTSTROM_VL_WERT = (RXBUF_UINT(8));
// Actual current of the VDC channel front left / Iststrom des VDC Kanals vorne links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_ISTSTROM_VL_WERT", STAT_VDC_ISTSTROM_VL_WERT, "\"mA\"");
unsigned short STAT_VDC_ISTSTROM_VR_WERT = (RXBUF_UINT(10));
// Actual current of the VDC channel in the front right / Iststrom des VDC Kanals vorne rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_ISTSTROM_VR_WERT", STAT_VDC_ISTSTROM_VR_WERT, "\"mA\"");
unsigned short STAT_VDC_ISTSTROM_HL_WERT = (RXBUF_UINT(12));
// Actual current of the VDC channel at the rear left / Iststrom des VDC Kanals hinten links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_ISTSTROM_HL_WERT", STAT_VDC_ISTSTROM_HL_WERT, "\"mA\"");
unsigned short STAT_VDC_ISTSTROM_HR_WERT = (RXBUF_UINT(14));
// Actual current of the VDC channel at the rear right / Iststrom des VDC Kanals hinten rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_ISTSTROM_HR_WERT", STAT_VDC_ISTSTROM_HR_WERT, "\"mA\"");
unsigned char STAT_VDC_STATUS_VL = (RXBUF_UCHAR(16));
// Status of the front left VDC channel / Status des VDC Kanals vorne links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_STATUS_VL", STAT_VDC_STATUS_VL, "\"0-n\"");
unsigned char STAT_VDC_STATUS_VR = (RXBUF_UCHAR(17));
// Status of the VDC channel in the front right / Status des VDC Kanals vorne rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_STATUS_VR", STAT_VDC_STATUS_VR, "\"0-n\"");
unsigned char STAT_VDC_STATUS_HL = (RXBUF_UCHAR(18));
// Status of the VDC channel in the back left / Status des VDC Kanals hinten links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_STATUS_HL", STAT_VDC_STATUS_HL, "\"0-n\"");
unsigned char STAT_VDC_STATUS_HR = (RXBUF_UCHAR(19));
// Status of the VDC channel in the back right / Status des VDC Kanals hinten rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN", "STAT_VDC_STATUS_HR", STAT_VDC_STATUS_HR, "\"0-n\"");
unsigned char STAT_KLEMMEN = (RXBUF_UCHAR(20));
// Internal status of terminal KL15 0 = KL15 OFF 1 = KL15 ON / Interner Status der Klemme KL15 0 = KL15 AUS 1 =
// KL15 AN
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN", "STAT_KLEMMEN", STAT_KLEMMEN, "\"0-n\"");
float STAT_WHL_SPD_VL_WERT = (RXBUF_UINT(21)*0.0156f-511.984);
// Front left wheel speed (from FlexRay) / Radgeschwindigkeit vorne links (von FlexRay)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "SAS", "VDC0_LESEN", "STAT_WHL_SPD_VL_WERT", STAT_WHL_SPD_VL_WERT, "\"rad/s\"");
float STAT_WHL_SPD_VR_WERT = (RXBUF_UINT(23)*0.0156f-511.984);
// Wheel speed front right (from FlexRay) / Radgeschwindigkeit vorne rechts (von FlexRay)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "SAS", "VDC0_LESEN", "STAT_WHL_SPD_VR_WERT", STAT_WHL_SPD_VR_WERT, "\"rad/s\"");
float STAT_WHL_SPD_HL_WERT = (RXBUF_UINT(25)*0.0156f-511.984);
// Rear left wheel speed (from FlexRay) / Radgeschwindigkeit hinten links (von FlexRay)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "SAS", "VDC0_LESEN", "STAT_WHL_SPD_HL_WERT", STAT_WHL_SPD_HL_WERT, "\"rad/s\"");
float STAT_WHL_SPD_HR_WERT = (RXBUF_UINT(27)*0.0156f-511.984);
// Wheel speed rear right (from FlexRay) / Radgeschwindigkeit hinten rechts (von FlexRay)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "SAS", "VDC0_LESEN", "STAT_WHL_SPD_HR_WERT", STAT_WHL_SPD_HR_WERT, "\"rad/s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_SAS_VDC0_LESEN_0XD817: { // 0xD817
if (datalen < 29) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_SAS_VDC0_LESEN_0XD817", 29);
break;
}
unsigned short STAT_VDC_SOLLSTROM_VL_WERT_0XD817 = (RXBUF_UINT(0));
// Target current of the VDC channel in the front left / Sollstrom des VDC Kanals vorne links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_SOLLSTROM_VL_WERT_0XD817", STAT_VDC_SOLLSTROM_VL_WERT_0XD817, "\"mA\"");
unsigned short STAT_VDC_SOLLSTROM_VR_WERT_0XD817 = (RXBUF_UINT(2));
// Target current of the VDC channel in the front right / Sollstrom des VDC Kanals vorne rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_SOLLSTROM_VR_WERT_0XD817", STAT_VDC_SOLLSTROM_VR_WERT_0XD817, "\"mA\"");
unsigned short STAT_VDC_SOLLSTROM_HL_WERT_0XD817 = (RXBUF_UINT(4));
// Target current of the VDC channel at the rear left / Sollstrom des VDC Kanals hinten links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_SOLLSTROM_HL_WERT_0XD817", STAT_VDC_SOLLSTROM_HL_WERT_0XD817, "\"mA\"");
unsigned short STAT_VDC_SOLLSTROM_HR_WERT_0XD817 = (RXBUF_UINT(6));
// Set current of the VDC channel at the rear right / Sollstrom des VDC Kanals hinten rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_SOLLSTROM_HR_WERT_0XD817", STAT_VDC_SOLLSTROM_HR_WERT_0XD817, "\"mA\"");
unsigned short STAT_VDC_ISTSTROM_VL_WERT_0XD817 = (RXBUF_UINT(8));
// Actual current of the VDC channel front left / Iststrom des VDC Kanals vorne links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_ISTSTROM_VL_WERT_0XD817", STAT_VDC_ISTSTROM_VL_WERT_0XD817, "\"mA\"");
unsigned short STAT_VDC_ISTSTROM_VR_WERT_0XD817 = (RXBUF_UINT(10));
// Actual current of the VDC channel in the front right / Iststrom des VDC Kanals vorne rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_ISTSTROM_VR_WERT_0XD817", STAT_VDC_ISTSTROM_VR_WERT_0XD817, "\"mA\"");
unsigned short STAT_VDC_ISTSTROM_HL_WERT_0XD817 = (RXBUF_UINT(12));
// Actual current of the VDC channel at the rear left / Iststrom des VDC Kanals hinten links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_ISTSTROM_HL_WERT_0XD817", STAT_VDC_ISTSTROM_HL_WERT_0XD817, "\"mA\"");
unsigned short STAT_VDC_ISTSTROM_HR_WERT_0XD817 = (RXBUF_UINT(14));
// Actual current of the VDC channel at the rear right / Iststrom des VDC Kanals hinten rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_ISTSTROM_HR_WERT_0XD817", STAT_VDC_ISTSTROM_HR_WERT_0XD817, "\"mA\"");
unsigned char STAT_VDC_STATUS_VL_0XD817 = (RXBUF_UCHAR(16));
// Status of the front left VDC channel / Status des VDC Kanals vorne links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_STATUS_VL_0XD817", STAT_VDC_STATUS_VL_0XD817, "\"0-n\"");
unsigned char STAT_VDC_STATUS_VR_0XD817 = (RXBUF_UCHAR(17));
// Status of the VDC channel in the front right / Status des VDC Kanals vorne rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_STATUS_VR_0XD817", STAT_VDC_STATUS_VR_0XD817, "\"0-n\"");
unsigned char STAT_VDC_STATUS_HL_0XD817 = (RXBUF_UCHAR(18));
// Status of the VDC channel in the back left / Status des VDC Kanals hinten links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_STATUS_HL_0XD817", STAT_VDC_STATUS_HL_0XD817, "\"0-n\"");
unsigned char STAT_VDC_STATUS_HR_0XD817 = (RXBUF_UCHAR(19));
// Status of the VDC channel in the back right / Status des VDC Kanals hinten rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_VDC_STATUS_HR_0XD817", STAT_VDC_STATUS_HR_0XD817, "\"0-n\"");
unsigned char STAT_KLEMMEN_0XD817 = (RXBUF_UCHAR(20));
// Internal status of terminal KL15 0 = KL15 OFF 1 = KL15 ON / Interner Status der Klemme KL15 0 = KL15 AUS 1 =
// KL15 AN
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_KLEMMEN_0XD817", STAT_KLEMMEN_0XD817, "\"0-n\"");
float STAT_WHL_SPD_VL_WERT_0XD817 = (RXBUF_UINT(21)*0.0156f-511.984);
// Front left wheel speed (from FlexRay) / Radgeschwindigkeit vorne links (von FlexRay)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_WHL_SPD_VL_WERT_0XD817", STAT_WHL_SPD_VL_WERT_0XD817, "\"rad/s\"");
float STAT_WHL_SPD_VR_WERT_0XD817 = (RXBUF_UINT(23)*0.0156f-511.984);
// Wheel speed front right (from FlexRay) / Radgeschwindigkeit vorne rechts (von FlexRay)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_WHL_SPD_VR_WERT_0XD817", STAT_WHL_SPD_VR_WERT_0XD817, "\"rad/s\"");
float STAT_WHL_SPD_HL_WERT_0XD817 = (RXBUF_UINT(25)*0.0156f-511.984);
// Rear left wheel speed (from FlexRay) / Radgeschwindigkeit hinten links (von FlexRay)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_WHL_SPD_HL_WERT_0XD817", STAT_WHL_SPD_HL_WERT_0XD817, "\"rad/s\"");
float STAT_WHL_SPD_HR_WERT_0XD817 = (RXBUF_UINT(27)*0.0156f-511.984);
// Wheel speed rear right (from FlexRay) / Radgeschwindigkeit hinten rechts (von FlexRay)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "SAS", "VDC0_LESEN_0XD817", "STAT_WHL_SPD_HR_WERT_0XD817", STAT_WHL_SPD_HR_WERT_0XD817, "\"rad/s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_SAS_STATUS_SWC_VERSIONEN_LESEN_ANZAHL_DATENSAETZE: { // 0xDD33
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_SAS_STATUS_SWC_VERSIONEN_LESEN_ANZAHL_DATENSAETZE", 2);
break;
}
unsigned short STAT_INDEX_DATENSATZ_WERT = (RXBUF_UINT(0));
// - / -
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "SAS", "STATUS_SWC_VERSIONEN_LESEN_ANZAHL_DATENSAETZE", "STAT_INDEX_DATENSATZ_WERT", STAT_INDEX_DATENSATZ_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_SAS_READ_EXCEPTION_DATA: { // 0x4001
if (datalen < 50) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_SAS_READ_EXCEPTION_DATA", 50);
break;
}
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_SAS_CLEAR_EXCEPTION_DATA: { // 0xF000
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}

View File

@ -1,221 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/sas_i1.json: SAS 22: Optional equipment system
// This generated code makes it easier to process CANBUS messages from the SAS ecu in a BMW i3
//
#define I3_ECU_SAS_TX 0x06F122
#define I3_ECU_SAS_RX 0x0622F1
// Skipping SWC_VERSIONEN_LESEN_INDEX_DATENSATZ on 0xA200 which takes arguments
// Skipping SWC_VERSIONEN_LESEN_KMAIN_KSUB on 0xA201 which takes arguments
// Skipping VDC0_FESTSTROM on 0xABC7 which takes arguments
// Skipping VDC0_FESTSTROM on 0xABC7 which takes arguments
// Skipping VDC0_MODUS on 0xABC8 which takes arguments
#define I3_PID_SAS_LERNDATEN_RUECKSETZEN 0xABC9
// Learning data (of the learning infrastructure) are reset to default values. / Lerndaten (der Infrastruktur
// Lernen) werden auf Standardwerte zurückgesetzt.
#define I3_PID_SAS_VDC0_LESEN 0xD817
// Reading out the current status of each VDC0 valve (status, actual current, target current) and environmental
// data (terminal, wheel speeds, ¿). / Auslesen des aktuellen Status jedes VDC0-Ventils (Status, Ist-Strom,
// Soll-Strom) und Umgebungsdaten (Klemme, Radgeschwindigkeiten,¿).
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VL_WERT (RXBUF_UINT(0))
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VL_WERT_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VL_WERT_TYPE unsigned short
// Target current of the VDC channel in the front left / Sollstrom des VDC Kanals vorne links
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VR_WERT (RXBUF_UINT(2))
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VR_WERT_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VR_WERT_TYPE unsigned short
// Target current of the VDC channel in the front right / Sollstrom des VDC Kanals vorne rechts
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HL_WERT (RXBUF_UINT(4))
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HL_WERT_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HL_WERT_TYPE unsigned short
// Target current of the VDC channel at the rear left / Sollstrom des VDC Kanals hinten links
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HR_WERT (RXBUF_UINT(6))
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HR_WERT_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HR_WERT_TYPE unsigned short
// Set current of the VDC channel at the rear right / Sollstrom des VDC Kanals hinten rechts
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VL_WERT (RXBUF_UINT(8))
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VL_WERT_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VL_WERT_TYPE unsigned short
// Actual current of the VDC channel front left / Iststrom des VDC Kanals vorne links
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VR_WERT (RXBUF_UINT(10))
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VR_WERT_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VR_WERT_TYPE unsigned short
// Actual current of the VDC channel in the front right / Iststrom des VDC Kanals vorne rechts
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HL_WERT (RXBUF_UINT(12))
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HL_WERT_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HL_WERT_TYPE unsigned short
// Actual current of the VDC channel at the rear left / Iststrom des VDC Kanals hinten links
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HR_WERT (RXBUF_UINT(14))
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HR_WERT_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HR_WERT_TYPE unsigned short
// Actual current of the VDC channel at the rear right / Iststrom des VDC Kanals hinten rechts
#define I3_RES_SAS_STAT_VDC_STATUS_VL (RXBUF_UCHAR(16))
#define I3_RES_SAS_STAT_VDC_STATUS_VL_UNIT '0-n'
#define I3_RES_SAS_STAT_VDC_STATUS_VL_TYPE unsigned char
// Status of the front left VDC channel / Status des VDC Kanals vorne links
#define I3_RES_SAS_STAT_VDC_STATUS_VR (RXBUF_UCHAR(17))
#define I3_RES_SAS_STAT_VDC_STATUS_VR_UNIT '0-n'
#define I3_RES_SAS_STAT_VDC_STATUS_VR_TYPE unsigned char
// Status of the VDC channel in the front right / Status des VDC Kanals vorne rechts
#define I3_RES_SAS_STAT_VDC_STATUS_HL (RXBUF_UCHAR(18))
#define I3_RES_SAS_STAT_VDC_STATUS_HL_UNIT '0-n'
#define I3_RES_SAS_STAT_VDC_STATUS_HL_TYPE unsigned char
// Status of the VDC channel in the back left / Status des VDC Kanals hinten links
#define I3_RES_SAS_STAT_VDC_STATUS_HR (RXBUF_UCHAR(19))
#define I3_RES_SAS_STAT_VDC_STATUS_HR_UNIT '0-n'
#define I3_RES_SAS_STAT_VDC_STATUS_HR_TYPE unsigned char
// Status of the VDC channel in the back right / Status des VDC Kanals hinten rechts
#define I3_RES_SAS_STAT_KLEMMEN (RXBUF_UCHAR(20))
#define I3_RES_SAS_STAT_KLEMMEN_UNIT '0-n'
#define I3_RES_SAS_STAT_KLEMMEN_TYPE unsigned char
// Internal status of terminal KL15 0 = KL15 OFF 1 = KL15 ON / Interner Status der Klemme KL15 0 = KL15 AUS 1 =
// KL15 AN
#define I3_RES_SAS_STAT_WHL_SPD_VL_WERT (RXBUF_UINT(21)*0.0156f-511.984)
#define I3_RES_SAS_STAT_WHL_SPD_VL_WERT_UNIT 'rad/s'
#define I3_RES_SAS_STAT_WHL_SPD_VL_WERT_TYPE float
// Front left wheel speed (from FlexRay) / Radgeschwindigkeit vorne links (von FlexRay)
#define I3_RES_SAS_STAT_WHL_SPD_VR_WERT (RXBUF_UINT(23)*0.0156f-511.984)
#define I3_RES_SAS_STAT_WHL_SPD_VR_WERT_UNIT 'rad/s'
#define I3_RES_SAS_STAT_WHL_SPD_VR_WERT_TYPE float
// Wheel speed front right (from FlexRay) / Radgeschwindigkeit vorne rechts (von FlexRay)
#define I3_RES_SAS_STAT_WHL_SPD_HL_WERT (RXBUF_UINT(25)*0.0156f-511.984)
#define I3_RES_SAS_STAT_WHL_SPD_HL_WERT_UNIT 'rad/s'
#define I3_RES_SAS_STAT_WHL_SPD_HL_WERT_TYPE float
// Rear left wheel speed (from FlexRay) / Radgeschwindigkeit hinten links (von FlexRay)
#define I3_RES_SAS_STAT_WHL_SPD_HR_WERT (RXBUF_UINT(27)*0.0156f-511.984)
#define I3_RES_SAS_STAT_WHL_SPD_HR_WERT_UNIT 'rad/s'
#define I3_RES_SAS_STAT_WHL_SPD_HR_WERT_TYPE float
// Wheel speed rear right (from FlexRay) / Radgeschwindigkeit hinten rechts (von FlexRay)
#define I3_PID_SAS_VDC0_LESEN_0XD817 0xD817
// Reading out the current status of each VDC0 valve (status, actual current, target current) and environmental
// data (terminal, wheel speeds, ¿). / Auslesen des aktuellen Status jedes VDC0-Ventils (Status, Ist-Strom,
// Soll-Strom) und Umgebungsdaten (Klemme, Radgeschwindigkeiten,¿).
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VL_WERT_0XD817 (RXBUF_UINT(0))
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VL_WERT_0XD817_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VL_WERT_0XD817_TYPE unsigned short
// Target current of the VDC channel in the front left / Sollstrom des VDC Kanals vorne links
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VR_WERT_0XD817 (RXBUF_UINT(2))
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VR_WERT_0XD817_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_VR_WERT_0XD817_TYPE unsigned short
// Target current of the VDC channel in the front right / Sollstrom des VDC Kanals vorne rechts
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HL_WERT_0XD817 (RXBUF_UINT(4))
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HL_WERT_0XD817_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HL_WERT_0XD817_TYPE unsigned short
// Target current of the VDC channel at the rear left / Sollstrom des VDC Kanals hinten links
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HR_WERT_0XD817 (RXBUF_UINT(6))
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HR_WERT_0XD817_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_SOLLSTROM_HR_WERT_0XD817_TYPE unsigned short
// Set current of the VDC channel at the rear right / Sollstrom des VDC Kanals hinten rechts
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VL_WERT_0XD817 (RXBUF_UINT(8))
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VL_WERT_0XD817_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VL_WERT_0XD817_TYPE unsigned short
// Actual current of the VDC channel front left / Iststrom des VDC Kanals vorne links
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VR_WERT_0XD817 (RXBUF_UINT(10))
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VR_WERT_0XD817_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_ISTSTROM_VR_WERT_0XD817_TYPE unsigned short
// Actual current of the VDC channel in the front right / Iststrom des VDC Kanals vorne rechts
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HL_WERT_0XD817 (RXBUF_UINT(12))
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HL_WERT_0XD817_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HL_WERT_0XD817_TYPE unsigned short
// Actual current of the VDC channel at the rear left / Iststrom des VDC Kanals hinten links
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HR_WERT_0XD817 (RXBUF_UINT(14))
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HR_WERT_0XD817_UNIT 'mA'
#define I3_RES_SAS_STAT_VDC_ISTSTROM_HR_WERT_0XD817_TYPE unsigned short
// Actual current of the VDC channel at the rear right / Iststrom des VDC Kanals hinten rechts
#define I3_RES_SAS_STAT_VDC_STATUS_VL_0XD817 (RXBUF_UCHAR(16))
#define I3_RES_SAS_STAT_VDC_STATUS_VL_0XD817_UNIT '0-n'
#define I3_RES_SAS_STAT_VDC_STATUS_VL_0XD817_TYPE unsigned char
// Status of the front left VDC channel / Status des VDC Kanals vorne links
#define I3_RES_SAS_STAT_VDC_STATUS_VR_0XD817 (RXBUF_UCHAR(17))
#define I3_RES_SAS_STAT_VDC_STATUS_VR_0XD817_UNIT '0-n'
#define I3_RES_SAS_STAT_VDC_STATUS_VR_0XD817_TYPE unsigned char
// Status of the VDC channel in the front right / Status des VDC Kanals vorne rechts
#define I3_RES_SAS_STAT_VDC_STATUS_HL_0XD817 (RXBUF_UCHAR(18))
#define I3_RES_SAS_STAT_VDC_STATUS_HL_0XD817_UNIT '0-n'
#define I3_RES_SAS_STAT_VDC_STATUS_HL_0XD817_TYPE unsigned char
// Status of the VDC channel in the back left / Status des VDC Kanals hinten links
#define I3_RES_SAS_STAT_VDC_STATUS_HR_0XD817 (RXBUF_UCHAR(19))
#define I3_RES_SAS_STAT_VDC_STATUS_HR_0XD817_UNIT '0-n'
#define I3_RES_SAS_STAT_VDC_STATUS_HR_0XD817_TYPE unsigned char
// Status of the VDC channel in the back right / Status des VDC Kanals hinten rechts
#define I3_RES_SAS_STAT_KLEMMEN_0XD817 (RXBUF_UCHAR(20))
#define I3_RES_SAS_STAT_KLEMMEN_0XD817_UNIT '0-n'
#define I3_RES_SAS_STAT_KLEMMEN_0XD817_TYPE unsigned char
// Internal status of terminal KL15 0 = KL15 OFF 1 = KL15 ON / Interner Status der Klemme KL15 0 = KL15 AUS 1 =
// KL15 AN
#define I3_RES_SAS_STAT_WHL_SPD_VL_WERT_0XD817 (RXBUF_UINT(21)*0.0156f-511.984)
#define I3_RES_SAS_STAT_WHL_SPD_VL_WERT_0XD817_UNIT 'rad/s'
#define I3_RES_SAS_STAT_WHL_SPD_VL_WERT_0XD817_TYPE float
// Front left wheel speed (from FlexRay) / Radgeschwindigkeit vorne links (von FlexRay)
#define I3_RES_SAS_STAT_WHL_SPD_VR_WERT_0XD817 (RXBUF_UINT(23)*0.0156f-511.984)
#define I3_RES_SAS_STAT_WHL_SPD_VR_WERT_0XD817_UNIT 'rad/s'
#define I3_RES_SAS_STAT_WHL_SPD_VR_WERT_0XD817_TYPE float
// Wheel speed front right (from FlexRay) / Radgeschwindigkeit vorne rechts (von FlexRay)
#define I3_RES_SAS_STAT_WHL_SPD_HL_WERT_0XD817 (RXBUF_UINT(25)*0.0156f-511.984)
#define I3_RES_SAS_STAT_WHL_SPD_HL_WERT_0XD817_UNIT 'rad/s'
#define I3_RES_SAS_STAT_WHL_SPD_HL_WERT_0XD817_TYPE float
// Rear left wheel speed (from FlexRay) / Radgeschwindigkeit hinten links (von FlexRay)
#define I3_RES_SAS_STAT_WHL_SPD_HR_WERT_0XD817 (RXBUF_UINT(27)*0.0156f-511.984)
#define I3_RES_SAS_STAT_WHL_SPD_HR_WERT_0XD817_UNIT 'rad/s'
#define I3_RES_SAS_STAT_WHL_SPD_HR_WERT_0XD817_TYPE float
// Wheel speed rear right (from FlexRay) / Radgeschwindigkeit hinten rechts (von FlexRay)
#define I3_PID_SAS_STATUS_SWC_VERSIONEN_LESEN_ANZAHL_DATENSAETZE 0xDD33
// - / -
#define I3_RES_SAS_STAT_INDEX_DATENSATZ_WERT (RXBUF_UINT(0))
#define I3_RES_SAS_STAT_INDEX_DATENSATZ_WERT_TYPE unsigned short
// - / -
#define I3_PID_SAS_READ_EXCEPTION_DATA 0x4001
// Developer data for analyzing exceptions / Entwicklerdaten zur Analyse von Exceptions
// Can't yet generate code for STAT_EXCEPTION_DATA of type data[50] at offset 0. But we account for the 50 bytes
// Developer data for analyzing exceptions / Entwicklerdaten zur Analyse von Exceptions
#define I3_PID_SAS_CLEAR_EXCEPTION_DATA 0xF000
// Deletion of the additional data to support the debugging of occurring exceptions / Löschen der zusätzlichen
// Daten zur Unterstützung des Debuggens auftretender Exceptions

View File

@ -1,11 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/sas_i1.json: SAS 22: Optional equipment system
// This generated code makes it easier to process CANBUS messages from the SAS ecu in a BMW i3
//
//{ I3_ECU_SAS_TX, I3_ECU_SAS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SAS_LERNDATEN_RUECKSETZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xABC9
//{ I3_ECU_SAS_TX, I3_ECU_SAS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SAS_VDC0_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD817
//{ I3_ECU_SAS_TX, I3_ECU_SAS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SAS_VDC0_LESEN_0XD817, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD817
//{ I3_ECU_SAS_TX, I3_ECU_SAS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SAS_STATUS_SWC_VERSIONEN_LESEN_ANZAHL_DATENSAETZE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD33
//{ I3_ECU_SAS_TX, I3_ECU_SAS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SAS_READ_EXCEPTION_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x4001
//{ I3_ECU_SAS_TX, I3_ECU_SAS_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SAS_CLEAR_EXCEPTION_DATA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF000

View File

@ -1,134 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/sme_i1.json: SME 07: Battery management electronics
// This generated code makes it easier to process CANBUS messages from the SME ecu in a BMW i3
//
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ALTERUNG_INNENWIDERSTAND_TS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6334
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ALTERUNG_KAPAZITAET_TS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6335
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME__ST_SYM_MODUS, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6516
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME__UEBERLAST_ZAHELER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x651D
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME__STATUS_UEBERNAHME_KAPATEST_NV, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x6526
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ISOLATIONSWIDERSTAND_KOMMUNIKATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAD5E
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ISOLATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAD61
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_KAPAZITAET_BESTIMMUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAD66
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HEIZUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAD6A
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SYMMETRIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAD6B
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HEIZUNG_FUNKTION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xAD73
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RB_SOC_REKALIBRIERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD4C5
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SOC_GUETE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD4C7
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_SOC_GUETE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD4C8
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ANZAHL_OCV_SOC_REKAL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD4C9
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ANZAHL_LADEENDE_REKAL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD4CA
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RB_SOC_VOLLADEENDE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD4CB
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_KUEHLDAUER_HVB, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD4CC
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_LADUNGSVERLUST_ZELLE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD67F
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_STATUS_MIN_KAPAZITAET_MOD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD681
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RB_ISO_MESS_TRG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6C7
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RB_ISO_MESS_STD_IO_NIO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6C8
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RB_ISO_MESS_TRG_IO_NIO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6C9
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ISODIAG_INPUT_ISTWERTE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6CA
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ISO_ERR_STD_FZ1_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6CB
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RB_SOH_KAPATEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6CC
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_REKU_VOLTAGE_LIFT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6CD
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RB_ALTERUNG_KAPA, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6CE
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_CSC_TEMPERATUREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6CF
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ISO_ERR_TRG_FZ1_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD6D1
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SCHUETZ_SCHALTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD60
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SCHUETZSCHALTUNGEN_ANZAHL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD63
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HVIL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD64
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_SPANNUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD66
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ANZAHL_KUEHLANFORDERUNG_DRINGEND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD67
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_SPANNUNG_BERECHNET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD68
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_STROM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD69
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ISOLATIONSWIDERSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD6A
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_KUEHLKREISLAUF_TEMP, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD6C
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_AUFSTART_VERHINDERER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD72
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_CUMULATIVE_LADUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD73
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_CUMULATIVE_ENTLADUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD74
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_STATUS_KL30C_SPANNUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD76
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ALTERUNG_KAPAZITAET, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD7B
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_GW_INFO, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD7C
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_STROMGRENZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD7D
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SPANNUNGSGRENZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD7E
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HVB_HISTORIE_ZYKLEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD8E
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ZEIT_TEMP_HISTOGRAMM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD90
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ZEIT_SOC_KLASSE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD91
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T1_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD94
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T2_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD95
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T3_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD96
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T4_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD97
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T5_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD98
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T6_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD99
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T7_1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDD9A
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_LADEZIELSPANNUNG_TAUSCH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDAB
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_SPANNUNG_BATTERIE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDB4
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ALTERUNG_INNENWIDERSTAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDB6
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ANZEIGE_SOC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDBC
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SERVICE_DISCONNECT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDBD
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_VORLADUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDBE
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ZELLSPANNUNGEN_MIN_MAX, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDBF
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_TEMPERATUREN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDC0
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ALTERUNG_PARAMETER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDC2
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HISTO_SYM_DAUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDC6
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HISTO_SYM_ZELLANZAHL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDC7
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SYM_DELTASOC, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDC8
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_MAX_SYM_DAUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDC9
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SERIENNUMMER_ECU, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDCA
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SOC_GRENZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDCB
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_DIFFERENZ_SPANNUNGEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDCF
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ALTERUNG_KAPAZITAET_DEGRADATION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDE8
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ALTERUNG_KAPAZITAET_HISTOGRAMM_SOC_HUB, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDE9
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RINGPUFFER_LADEVORGAENGE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDEB
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_PROG_LADEZEIT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDEC
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_SPANNUNG_QUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDDEF
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ALPHA_INITIAL_ALTERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDE37
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_BETRIEBSSTUNDEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF60
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_COOL_DOWN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF62
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_KLEMMENZYKLEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF63
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_KUEHLDAUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF64
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_TEMP_SPREIZUNG_SYSTEM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF65
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_TEMP_KUEHLMITTEL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF66
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_LADUNG_KUEHLUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF67
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T1_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF68
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T4_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF69
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T3_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF6A
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T5_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF6B
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T2_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF6C
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T7_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF6D
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HV_BATT_HIST_SOC_T6_2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF6E
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_ERR_LIM_STROM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF6F
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_EFF_STROM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF70
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_PROJEKT_PARAMETER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF71
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_KURZSCHLUESSE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF72
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HEIZUNG_VERBAUT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF73
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_VOKO_HEIZ_DAUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF74
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_LADE_KOND_HEIZ_DAUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF75
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_VOKO_KUEHL_DAUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF76
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_LADE_DAUER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF77
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_SOC_WARN_GRENZEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF81
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ID_SBOX, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF83
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SOC_HISTORIE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF86
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_KL30C, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF89
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_EFF_STROM_TMIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF8A
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_EFF_STROM_TLOW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF8B
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_EFF_STROM_TMID, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF8C
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_EFF_STROM_THIGH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF8D
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_EFF_STROM_TMAX, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF8E
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_ERR_LIM_STROM_TMIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF8F
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_ERR_LIM_STROM_TLOW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF90
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_ERR_LIM_STROM_THIGH, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF91
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_ERR_LIM_STROM_TMAX, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF92
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_LADEZEIT_ADAPT_KENNFELD_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF9C
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_VERH_VOLLADE_LADEVORG_LESEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDF9E
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ZUSTAND_SPEICHER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFA0
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_ERR_LIM_SPANNUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFA1
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HIS_SOC_MAX_MIN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFAE
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_STATUS_HV_SPEICHER_ID, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFE1
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_SYMMETRIERBAND, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDFE2
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_GW_INFO_SCHNELLLADEN, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE50D
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_CODIERVARIABLEN_HV_SPEICHER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE540
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_ANZAHL_DEFEKTE_SICHERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE5F1
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_HVOFF_VOLTAGES, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE5F2
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_RB_SOH_KAPATEST_ERW, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE5F3
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_CPI_ANALYSE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE5F4
//{ I3_ECU_SME_TX, I3_ECU_SME_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_SME_KAPAZITAETSTEST_ASYMMETRIE_POTENTIAL, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xE5FA

View File

@ -1,545 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/zbe6.json: ZBE 67: iDrive controller
// This generated code makes it easier to process CANBUS messages from the ZBE ecu in a BMW i3
//
case I3_PID_ZBE_PROGRAMMING_COUNTER: { // 0x2502
if (datalen < 4) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_PROGRAMMING_COUNTER", 4);
break;
}
unsigned char STAT_RESERVE_WERT = (RXBUF_UCHAR(0));
// Reserve. Constant = 0x00 / Reserve. Konstante = 0x00
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "ZBE", "PROGRAMMING_COUNTER", "STAT_RESERVE_WERT", STAT_RESERVE_WERT, "");
unsigned char STAT_PROG_ZAEHLER_STATUS = (RXBUF_UCHAR(1));
// ProgrammingCounterStatus / ProgrammingCounterStatus
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "ZBE", "PROGRAMMING_COUNTER", "STAT_PROG_ZAEHLER_STATUS", STAT_PROG_ZAEHLER_STATUS, "\"0-n\"");
unsigned short STAT_PROG_ZAEHLER_WERT = (RXBUF_UINT(2));
// ProgrammingCounter / ProgrammingCounter
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "PROGRAMMING_COUNTER", "STAT_PROG_ZAEHLER_WERT", STAT_PROG_ZAEHLER_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_PROGRAMMING_COUNTER_MAX_VALUE: { // 0x2503
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_PROGRAMMING_COUNTER_MAX_VALUE", 2);
break;
}
unsigned short STAT_PROG_MAX_WERT = (RXBUF_UINT(0));
// maximum number of programming processes / maximalen Anzahl von Programmiervorgängen
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "PROGRAMMING_COUNTER_MAX_VALUE", "STAT_PROG_MAX_WERT", STAT_PROG_MAX_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_FLASH_TIMING_PARAMETER: { // 0x2504
if (datalen < 12) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_FLASH_TIMING_PARAMETER", 12);
break;
}
unsigned short STAT_ERASE_MEMORY_TIME_WERT = (RXBUF_UINT(0));
// EraseMemoryTime, maximum SWE deletion time with process control in the control unit. / EraseMemoryTime,
// maximale SWE-Löschzeit mit Ablaufkontrolle im Steuergerät.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "FLASH_TIMING_PARAMETER", "STAT_ERASE_MEMORY_TIME_WERT", STAT_ERASE_MEMORY_TIME_WERT, "\"s\"");
unsigned short STAT_CHECK_MEMORY_TIME_WERT = (RXBUF_UINT(2));
// CheckMemoryTime (e.g. signature check), maximum memory check time with process control in the control unit. /
// CheckMemoryTime (Bsp.: Signaturprüfung), maximale Speicherprüfzeit mit Ablaufkontrolle im Steuergerät.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "FLASH_TIMING_PARAMETER", "STAT_CHECK_MEMORY_TIME_WERT", STAT_CHECK_MEMORY_TIME_WERT, "\"s\"");
unsigned short STAT_BOOTLOADER_INSTALLATION_TIME_WERT = (RXBUF_UINT(4));
// BootloaderInstallationTime The time that is required after the reset so that the auxiliary bootloader is
// started, the bootloader is deleted, the new bootloader is copied, its signature is checked and the new
// bootloader is started until it can be diagnosed again. This information is mandatory for all control units,
// even if the control unit has not planned a bootloader update. A value of 0x0000 is prohibited. /
// BootloaderInstallationTime Die Zeit, die nach dem Reset benötigt wird, damit der Hilfsbootloader gestartet
// wird, den Bootloader löscht, den neuen Bootloader kopiert, dessen Signatur prüf und der neue Bootloader
// gestartet wird bis er wieder diagnosefähig ist. Angabe ist verpflichtend für alle Steuergeräte, auch wenn das
// Steuergerät keinen Bootloader Update geplant hat. Ein Wert von 0x0000 ist verboten.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "FLASH_TIMING_PARAMETER", "STAT_BOOTLOADER_INSTALLATION_TIME_WERT", STAT_BOOTLOADER_INSTALLATION_TIME_WERT, "\"s\"");
unsigned short STAT_AUTHENTICATION_TIME_WERT = (RXBUF_UINT(6));
// AuthenticationTime, the maximum time that the control device needs to check the authentication (sendKey) with
// flow control in the control device. / AuthenticationTime, die maximale Zeit, die das Steuergerät zur Prüfung
// der Authentisierung (sendKey) benötigt mit Ablaufkontrolle im Steuergerät.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "FLASH_TIMING_PARAMETER", "STAT_AUTHENTICATION_TIME_WERT", STAT_AUTHENTICATION_TIME_WERT, "\"s\"");
unsigned short STAT_RESET_TIME_WERT = (RXBUF_UINT(8));
// ResetTime The time refers to the transition from the ApplicationExtendedSession to the ProgrammingSession or
// to the transition from the ProgrammingSession to the DefaultSession. The maximum value is to be output. After
// the reset time has elapsed, the control unit can be addressed by diagnosis. / ResetTime Die Zeitangabe bezieht
// sich auf den Übergang von der ApplicationExtendedSesssion in die ProgrammingSession bzw. bei Übergang von der
// ProgrammingSession in die DefaultSession. Es ist der Maximalwert auszugeben. Nach Ablauf der ResetTime ist das
// Steuergerät durch Diagnose ansprechbar.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "FLASH_TIMING_PARAMETER", "STAT_RESET_TIME_WERT", STAT_RESET_TIME_WERT, "\"s\"");
unsigned short STAT_TRANSFER_DATA_TIME_WERT = (RXBUF_UINT(10));
// TransferDataTime The specification has to refer to a TransferData with a maximum block length to the time span
// from the complete reception of the data in the control unit via the possibly necessary decompression and the
// complete storage in the non-volatile memory up to and including the sending of the positive response. /
// TransferDataTime Die Angabe hat sich zu beziehen auf einen TransferData mit maximaler Blocklänge auf die
// Zeitspanne vom vollständigen Empfang der Daten im Steuergerät über das ggf. erforderliche Dekomprimieren und
// dem vollständigen Speichern im nichtflüchtigen Speicher bis einschließlich dem Senden der positiven Response.
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "FLASH_TIMING_PARAMETER", "STAT_TRANSFER_DATA_TIME_WERT", STAT_TRANSFER_DATA_TIME_WERT, "\"s\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_MILE_KM_EEPROM: { // 0x2540
if (datalen < 3) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_MILE_KM_EEPROM", 3);
break;
}
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_VARIANTE_ZBE: { // 0xD137
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_VARIANTE_ZBE", 1);
break;
}
unsigned char STAT_ZBE_VARIANTE_NR = (RXBUF_UCHAR(0));
// Variant ZBE: 0 = standard variant 1 = Asian variant 2 = standard variant with touchpad 3 = Asian variant with
// touchpad 255 = invalid value or ZBE not coded / Variante ZBE: 0 = Standardvariante 1 = Asiavariante 2 =
// Standardvariante mit Touchpad 3 = Asiavariante mit Touchpad 255 = Ungültiger Wert oder ZBE nicht codiert
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "ZBE", "VARIANTE_ZBE", "STAT_ZBE_VARIANTE_NR", STAT_ZBE_VARIANTE_NR, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_SCHRITTE_ROTRAD: { // 0xD14E
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_SCHRITTE_ROTRAD", 2);
break;
}
unsigned short STAT_REGISTER_ROTRAD_WERT = (RXBUF_UINT(0));
// Output of the current value for the position of the rotating wheel. Value 0 if the encoder has not been
// configured / Ausgabe vom aktuellen Wert für die Stellung des Rotationsrad. Wert 0, wenn Drehgeber nicht
// konfiguriert wurde
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%u%s\n", "ZBE", "SCHRITTE_ROTRAD", "STAT_REGISTER_ROTRAD_WERT", STAT_REGISTER_ROTRAD_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_TASTE1: { // 0xD213
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_TASTE1", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE1", "STAT_ANZAHL_DRUCK_WERT", STAT_ANZAHL_DRUCK_WERT, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE1", "STAT_ANZAHL_LANGDRUCK_WERT", STAT_ANZAHL_LANGDRUCK_WERT, "");
unsigned long STAT_ANZAHL_HAENGER_WERT = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE1", "STAT_ANZAHL_HAENGER_WERT", STAT_ANZAHL_HAENGER_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_TASTE2: { // 0xD214
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_TASTE2", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD214 = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE2", "STAT_ANZAHL_DRUCK_WERT_0XD214", STAT_ANZAHL_DRUCK_WERT_0XD214, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD214 = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE2", "STAT_ANZAHL_LANGDRUCK_WERT_0XD214", STAT_ANZAHL_LANGDRUCK_WERT_0XD214, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD214 = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE2", "STAT_ANZAHL_HAENGER_WERT_0XD214", STAT_ANZAHL_HAENGER_WERT_0XD214, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_TASTE3: { // 0xD215
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_TASTE3", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD215 = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE3", "STAT_ANZAHL_DRUCK_WERT_0XD215", STAT_ANZAHL_DRUCK_WERT_0XD215, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD215 = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE3", "STAT_ANZAHL_LANGDRUCK_WERT_0XD215", STAT_ANZAHL_LANGDRUCK_WERT_0XD215, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD215 = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE3", "STAT_ANZAHL_HAENGER_WERT_0XD215", STAT_ANZAHL_HAENGER_WERT_0XD215, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_TASTE4: { // 0xD216
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_TASTE4", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD216 = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE4", "STAT_ANZAHL_DRUCK_WERT_0XD216", STAT_ANZAHL_DRUCK_WERT_0XD216, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD216 = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE4", "STAT_ANZAHL_LANGDRUCK_WERT_0XD216", STAT_ANZAHL_LANGDRUCK_WERT_0XD216, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD216 = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE4", "STAT_ANZAHL_HAENGER_WERT_0XD216", STAT_ANZAHL_HAENGER_WERT_0XD216, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_TASTE5: { // 0xD217
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_TASTE5", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD217 = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE5", "STAT_ANZAHL_DRUCK_WERT_0XD217", STAT_ANZAHL_DRUCK_WERT_0XD217, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD217 = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE5", "STAT_ANZAHL_LANGDRUCK_WERT_0XD217", STAT_ANZAHL_LANGDRUCK_WERT_0XD217, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD217 = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE5", "STAT_ANZAHL_HAENGER_WERT_0XD217", STAT_ANZAHL_HAENGER_WERT_0XD217, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_TASTE6: { // 0xD218
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_TASTE6", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD218 = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE6", "STAT_ANZAHL_DRUCK_WERT_0XD218", STAT_ANZAHL_DRUCK_WERT_0XD218, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD218 = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE6", "STAT_ANZAHL_LANGDRUCK_WERT_0XD218", STAT_ANZAHL_LANGDRUCK_WERT_0XD218, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD218 = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE6", "STAT_ANZAHL_HAENGER_WERT_0XD218", STAT_ANZAHL_HAENGER_WERT_0XD218, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_TASTE7: { // 0xD219
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_TASTE7", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD219 = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE7", "STAT_ANZAHL_DRUCK_WERT_0XD219", STAT_ANZAHL_DRUCK_WERT_0XD219, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD219 = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE7", "STAT_ANZAHL_LANGDRUCK_WERT_0XD219", STAT_ANZAHL_LANGDRUCK_WERT_0XD219, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD219 = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE7", "STAT_ANZAHL_HAENGER_WERT_0XD219", STAT_ANZAHL_HAENGER_WERT_0XD219, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_TASTE8: { // 0xD21A
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_TASTE8", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD21A = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE8", "STAT_ANZAHL_DRUCK_WERT_0XD21A", STAT_ANZAHL_DRUCK_WERT_0XD21A, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD21A = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE8", "STAT_ANZAHL_LANGDRUCK_WERT_0XD21A", STAT_ANZAHL_LANGDRUCK_WERT_0XD21A, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD21A = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_TASTE8", "STAT_ANZAHL_HAENGER_WERT_0XD21A", STAT_ANZAHL_HAENGER_WERT_0XD21A, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_DREHSTELLER: { // 0xD21B
if (datalen < 36) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_DREHSTELLER", 36);
break;
}
unsigned long STAT_RASTEN_IM_UHRZEIGERSINN_WERT = (RXBUF_UINT32(0));
// Number of notches in clockwise direction / Anzahl Rasten im Uhrzeigersinn
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER", "STAT_RASTEN_IM_UHRZEIGERSINN_WERT", STAT_RASTEN_IM_UHRZEIGERSINN_WERT, "");
unsigned long STAT_RASTEN_GEGEN_UHRZEIGERSINN_WERT = (RXBUF_UINT32(8));
// Number of notches counterclockwise / Anzahl Rasten gegen Uhrzeigersinn
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER", "STAT_RASTEN_GEGEN_UHRZEIGERSINN_WERT", STAT_RASTEN_GEGEN_UHRZEIGERSINN_WERT, "");
unsigned long STAT_UNDERFLOW_WERT = (RXBUF_UINT32(16));
// Number of underflows, stop on the left / Anzahl Underflow, Anschlag links
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER", "STAT_UNDERFLOW_WERT", STAT_UNDERFLOW_WERT, "");
unsigned long STAT_OVERFLOW_WERT = (RXBUF_UINT32(24));
// Number of overflows, stop on the right / Anzahl Overflow, Anschlag rechts
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER", "STAT_OVERFLOW_WERT", STAT_OVERFLOW_WERT, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_DREHSTELLER_NORD: { // 0xD21C
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_DREHSTELLER_NORD", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD21C = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_NORD", "STAT_ANZAHL_DRUCK_WERT_0XD21C", STAT_ANZAHL_DRUCK_WERT_0XD21C, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD21C = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_NORD", "STAT_ANZAHL_LANGDRUCK_WERT_0XD21C", STAT_ANZAHL_LANGDRUCK_WERT_0XD21C, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD21C = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_NORD", "STAT_ANZAHL_HAENGER_WERT_0XD21C", STAT_ANZAHL_HAENGER_WERT_0XD21C, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_DREHSTELLER_OST: { // 0xD21D
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_DREHSTELLER_OST", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD21D = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_OST", "STAT_ANZAHL_DRUCK_WERT_0XD21D", STAT_ANZAHL_DRUCK_WERT_0XD21D, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD21D = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_OST", "STAT_ANZAHL_LANGDRUCK_WERT_0XD21D", STAT_ANZAHL_LANGDRUCK_WERT_0XD21D, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD21D = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_OST", "STAT_ANZAHL_HAENGER_WERT_0XD21D", STAT_ANZAHL_HAENGER_WERT_0XD21D, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_DREHSTELLER_SUED: { // 0xD21E
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_DREHSTELLER_SUED", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD21E = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_SUED", "STAT_ANZAHL_DRUCK_WERT_0XD21E", STAT_ANZAHL_DRUCK_WERT_0XD21E, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD21E = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_SUED", "STAT_ANZAHL_LANGDRUCK_WERT_0XD21E", STAT_ANZAHL_LANGDRUCK_WERT_0XD21E, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD21E = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_SUED", "STAT_ANZAHL_HAENGER_WERT_0XD21E", STAT_ANZAHL_HAENGER_WERT_0XD21E, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_DREHSTELLER_WEST: { // 0xD21F
if (datalen < 28) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_DREHSTELLER_WEST", 28);
break;
}
unsigned long STAT_ANZAHL_DRUCK_WERT_0XD21F = (RXBUF_UINT32(0));
// Number of prints / Anzahl Druck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_WEST", "STAT_ANZAHL_DRUCK_WERT_0XD21F", STAT_ANZAHL_DRUCK_WERT_0XD21F, "");
unsigned long STAT_ANZAHL_LANGDRUCK_WERT_0XD21F = (RXBUF_UINT32(8));
// Number of long presses / Anzahl Langdruck
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_WEST", "STAT_ANZAHL_LANGDRUCK_WERT_0XD21F", STAT_ANZAHL_LANGDRUCK_WERT_0XD21F, "");
unsigned long STAT_ANZAHL_HAENGER_WERT_0XD21F = (RXBUF_UINT32(16));
// Number of hangers / Anzahl Hänger
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%lu%s\n", "ZBE", "LOGGING_DREHSTELLER_WEST", "STAT_ANZAHL_HAENGER_WERT_0XD21F", STAT_ANZAHL_HAENGER_WERT_0XD21F, "");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_LOGGING_VERBAU: { // 0xD228
if (datalen < 30) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_LOGGING_VERBAU", 30);
break;
}
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_TOUCHPAD_BERUEHRUNG: { // 0xD60D
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_TOUCHPAD_BERUEHRUNG", 1);
break;
}
unsigned char STAT_TOUCHPAD_BERUEHRUNG = (RXBUF_UCHAR(0));
// Touch detection Touchpad: 0x00 = no touch detected 0x01 = touch detected / Berührungserkennung Touchpad: 0x00
// = keine Berührung erkannt 0x01 = Berührung erkannt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "ZBE", "TOUCHPAD_BERUEHRUNG", "STAT_TOUCHPAD_BERUEHRUNG", STAT_TOUCHPAD_BERUEHRUNG, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_TOUCHPAD_ANNAEHERUNG: { // 0xD68D
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_TOUCHPAD_ANNAEHERUNG", 1);
break;
}
unsigned char STAT_TOUCHPAD_ANNAEHERUNG = (RXBUF_UCHAR(0));
// Proximity detection touchpad: 0x00 = no proximity detected 0x01 = proximity detected / Annäherungsserkennung
// Touchpad: 0x00 = keine Annäherung erkannt 0x01 = Annäherung erkannt
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "ZBE", "TOUCHPAD_ANNAEHERUNG", "STAT_TOUCHPAD_ANNAEHERUNG", STAT_TOUCHPAD_ANNAEHERUNG, "\"0/1\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_SPANNUNG_KLEMME_30B_WERT: { // 0xDAD9
if (datalen < 2) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_SPANNUNG_KLEMME_30B_WERT", 2);
break;
}
float STAT_SPANNUNG_KLEMME_30B_WERT = (RXBUF_UINT(0)/10.0f);
// Voltage value on the control unit at terminal 30B (accurate to one decimal place) / Spannungswert am
// Steuergerät an Klemme 30B (auf eine Nachkommastelle genau)
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%.4f%s\n", "ZBE", "SPANNUNG_KLEMME_30B_WERT", "STAT_SPANNUNG_KLEMME_30B_WERT", STAT_SPANNUNG_KLEMME_30B_WERT, "\"V\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}
case I3_PID_ZBE_ACTIVE_DIAGNOSTIC_SESSION: { // 0xF186
if (datalen < 1) {
ESP_LOGW(TAG, "Received %d bytes for %s, expected %d", datalen, "I3_PID_ZBE_ACTIVE_DIAGNOSTIC_SESSION", 1);
break;
}
unsigned char STAT_ACTIVE_DIAGNOSTIC_SESSION = (RXBUF_UCHAR(0));
// activeDiagnosticSession / activeDiagnosticSession
ESP_LOGD(TAG, "From ECU %s, pid %s: got %s=%x%s\n", "ZBE", "ACTIVE_DIAGNOSTIC_SESSION", "STAT_ACTIVE_DIAGNOSTIC_SESSION", STAT_ACTIVE_DIAGNOSTIC_SESSION, "\"0-n\"");
// ========== Add your processing here ==========
hexdump(rxbuf, type, pid);
break;
}

View File

@ -1,539 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/zbe6.json: ZBE 67: iDrive controller
// This generated code makes it easier to process CANBUS messages from the ZBE ecu in a BMW i3
//
#define I3_ECU_ZBE_TX 0x06F167
#define I3_ECU_ZBE_RX 0x0667F1
#define I3_PID_ZBE_PROGRAMMING_COUNTER 0x2502
// Programming counter / Programming-Counter
#define I3_RES_ZBE_STAT_RESERVE_WERT (RXBUF_UCHAR(0))
#define I3_RES_ZBE_STAT_RESERVE_WERT_TYPE unsigned char
// Reserve. Constant = 0x00 / Reserve. Konstante = 0x00
#define I3_RES_ZBE_STAT_PROG_ZAEHLER_STATUS (RXBUF_UCHAR(1))
#define I3_RES_ZBE_STAT_PROG_ZAEHLER_STATUS_UNIT '0-n'
#define I3_RES_ZBE_STAT_PROG_ZAEHLER_STATUS_TYPE unsigned char
// ProgrammingCounterStatus / ProgrammingCounterStatus
#define I3_RES_ZBE_STAT_PROG_ZAEHLER_WERT (RXBUF_UINT(2))
#define I3_RES_ZBE_STAT_PROG_ZAEHLER_WERT_TYPE unsigned short
// ProgrammingCounter / ProgrammingCounter
#define I3_PID_ZBE_PROGRAMMING_COUNTER_MAX_VALUE 0x2503
// maximum number of programming processes / maximalen Anzahl von Programmiervorgängen
#define I3_RES_ZBE_STAT_PROG_MAX_WERT (RXBUF_UINT(0))
#define I3_RES_ZBE_STAT_PROG_MAX_WERT_TYPE unsigned short
// maximum number of programming processes / maximalen Anzahl von Programmiervorgängen
#define I3_PID_ZBE_FLASH_TIMING_PARAMETER 0x2504
// Programming specific timing parameters / Programmierspezifische Timing Parameter
#define I3_RES_ZBE_STAT_ERASE_MEMORY_TIME_WERT (RXBUF_UINT(0))
#define I3_RES_ZBE_STAT_ERASE_MEMORY_TIME_WERT_UNIT 's'
#define I3_RES_ZBE_STAT_ERASE_MEMORY_TIME_WERT_TYPE unsigned short
// EraseMemoryTime, maximum SWE deletion time with process control in the control unit. / EraseMemoryTime,
// maximale SWE-Löschzeit mit Ablaufkontrolle im Steuergerät.
#define I3_RES_ZBE_STAT_CHECK_MEMORY_TIME_WERT (RXBUF_UINT(2))
#define I3_RES_ZBE_STAT_CHECK_MEMORY_TIME_WERT_UNIT 's'
#define I3_RES_ZBE_STAT_CHECK_MEMORY_TIME_WERT_TYPE unsigned short
// CheckMemoryTime (e.g. signature check), maximum memory check time with process control in the control unit. /
// CheckMemoryTime (Bsp.: Signaturprüfung), maximale Speicherprüfzeit mit Ablaufkontrolle im Steuergerät.
#define I3_RES_ZBE_STAT_BOOTLOADER_INSTALLATION_TIME_WERT (RXBUF_UINT(4))
#define I3_RES_ZBE_STAT_BOOTLOADER_INSTALLATION_TIME_WERT_UNIT 's'
#define I3_RES_ZBE_STAT_BOOTLOADER_INSTALLATION_TIME_WERT_TYPE unsigned short
// BootloaderInstallationTime The time that is required after the reset so that the auxiliary bootloader is
// started, the bootloader is deleted, the new bootloader is copied, its signature is checked and the new
// bootloader is started until it can be diagnosed again. This information is mandatory for all control units,
// even if the control unit has not planned a bootloader update. A value of 0x0000 is prohibited. /
// BootloaderInstallationTime Die Zeit, die nach dem Reset benötigt wird, damit der Hilfsbootloader gestartet
// wird, den Bootloader löscht, den neuen Bootloader kopiert, dessen Signatur prüf und der neue Bootloader
// gestartet wird bis er wieder diagnosefähig ist. Angabe ist verpflichtend für alle Steuergeräte, auch wenn das
// Steuergerät keinen Bootloader Update geplant hat. Ein Wert von 0x0000 ist verboten.
#define I3_RES_ZBE_STAT_AUTHENTICATION_TIME_WERT (RXBUF_UINT(6))
#define I3_RES_ZBE_STAT_AUTHENTICATION_TIME_WERT_UNIT 's'
#define I3_RES_ZBE_STAT_AUTHENTICATION_TIME_WERT_TYPE unsigned short
// AuthenticationTime, the maximum time that the control device needs to check the authentication (sendKey) with
// flow control in the control device. / AuthenticationTime, die maximale Zeit, die das Steuergerät zur Prüfung
// der Authentisierung (sendKey) benötigt mit Ablaufkontrolle im Steuergerät.
#define I3_RES_ZBE_STAT_RESET_TIME_WERT (RXBUF_UINT(8))
#define I3_RES_ZBE_STAT_RESET_TIME_WERT_UNIT 's'
#define I3_RES_ZBE_STAT_RESET_TIME_WERT_TYPE unsigned short
// ResetTime The time refers to the transition from the ApplicationExtendedSession to the ProgrammingSession or
// to the transition from the ProgrammingSession to the DefaultSession. The maximum value is to be output. After
// the reset time has elapsed, the control unit can be addressed by diagnosis. / ResetTime Die Zeitangabe bezieht
// sich auf den Übergang von der ApplicationExtendedSesssion in die ProgrammingSession bzw. bei Übergang von der
// ProgrammingSession in die DefaultSession. Es ist der Maximalwert auszugeben. Nach Ablauf der ResetTime ist das
// Steuergerät durch Diagnose ansprechbar.
#define I3_RES_ZBE_STAT_TRANSFER_DATA_TIME_WERT (RXBUF_UINT(10))
#define I3_RES_ZBE_STAT_TRANSFER_DATA_TIME_WERT_UNIT 's'
#define I3_RES_ZBE_STAT_TRANSFER_DATA_TIME_WERT_TYPE unsigned short
// TransferDataTime The specification has to refer to a TransferData with a maximum block length to the time span
// from the complete reception of the data in the control unit via the possibly necessary decompression and the
// complete storage in the non-volatile memory up to and including the sending of the positive response. /
// TransferDataTime Die Angabe hat sich zu beziehen auf einen TransferData mit maximaler Blocklänge auf die
// Zeitspanne vom vollständigen Empfang der Daten im Steuergerät über das ggf. erforderliche Dekomprimieren und
// dem vollständigen Speichern im nichtflüchtigen Speicher bis einschließlich dem Senden der positiven Response.
#define I3_PID_ZBE_MILE_KM_EEPROM 0x2540
// Mileage stored in the EEPROM. / Im EEPROM abgelegter Kilometerstand.
// Can't yet generate code for STAT_MILE_KM_EEPROM_DATA of type data[3] at offset 0. But we account for the 3 bytes
// Mileage stored in the EEPROM. / Im EEPROM abgelegter Kilometerstand.
// Skipping STELLGLIED_POSITIONEN on 0xD134 which takes arguments
#define I3_PID_ZBE_VARIANTE_ZBE 0xD137
// Variant ZBE: 0 = standard variant 1 = Asian variant 2 = standard variant with touchpad 3 = Asian variant with
// touchpad 255 = invalid value or ZBE not coded / Variante ZBE: 0 = Standardvariante 1 = Asiavariante 2 =
// Standardvariante mit Touchpad 3 = Asiavariante mit Touchpad 255 = Ungültiger Wert oder ZBE nicht codiert
#define I3_RES_ZBE_STAT_ZBE_VARIANTE_NR (RXBUF_UCHAR(0))
#define I3_RES_ZBE_STAT_ZBE_VARIANTE_NR_UNIT '0-n'
#define I3_RES_ZBE_STAT_ZBE_VARIANTE_NR_TYPE unsigned char
// Variant ZBE: 0 = standard variant 1 = Asian variant 2 = standard variant with touchpad 3 = Asian variant with
// touchpad 255 = invalid value or ZBE not coded / Variante ZBE: 0 = Standardvariante 1 = Asiavariante 2 =
// Standardvariante mit Touchpad 3 = Asiavariante mit Touchpad 255 = Ungültiger Wert oder ZBE nicht codiert
// Skipping ZBE_TASTEN on 0xD14D which takes arguments
#define I3_PID_ZBE_SCHRITTE_ROTRAD 0xD14E
// Output of the current value for the position of the rotating wheel. Value 0 if the encoder has not been
// configured / Ausgabe vom aktuellen Wert für die Stellung des Rotationsrad. Wert 0, wenn Drehgeber nicht
// konfiguriert wurde
#define I3_RES_ZBE_STAT_REGISTER_ROTRAD_WERT (RXBUF_UINT(0))
#define I3_RES_ZBE_STAT_REGISTER_ROTRAD_WERT_TYPE unsigned short
// Output of the current value for the position of the rotating wheel. Value 0 if the encoder has not been
// configured / Ausgabe vom aktuellen Wert für die Stellung des Rotationsrad. Wert 0, wenn Drehgeber nicht
// konfiguriert wurde
#define I3_PID_ZBE_LOGGING_TASTE1 0xD213
// Logging data of the keys. / Loggingdaten der Tasten.
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_TASTE2 0xD214
// Logging data of the keys. / Loggingdaten der Tasten.
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD214 (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD214_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD214 of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD214 (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD214_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD214 of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD214 (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD214_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD214 of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD214 of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_TASTE3 0xD215
// Logging data of the keys. / Loggingdaten der Tasten.
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD215 (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD215_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD215 of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD215 (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD215_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD215 of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD215 (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD215_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD215 of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD215 of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_TASTE4 0xD216
// Logging data of the keys. / Loggingdaten der Tasten.
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD216 (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD216_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD216 of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD216 (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD216_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD216 of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD216 (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD216_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD216 of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD216 of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_TASTE5 0xD217
// Logging data of the keys. / Loggingdaten der Tasten.
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD217 (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD217_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD217 of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD217 (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD217_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD217 of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD217 (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD217_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD217 of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD217 of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_TASTE6 0xD218
// Logging data of the keys. / Loggingdaten der Tasten.
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD218 (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD218_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD218 of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD218 (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD218_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD218 of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD218 (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD218_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD218 of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD218 of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_TASTE7 0xD219
// Logging data of the keys. / Loggingdaten der Tasten.
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD219 (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD219_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD219 of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD219 (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD219_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD219 of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD219 (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD219_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD219 of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD219 of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_TASTE8 0xD21A
// Logging data of the keys. / Loggingdaten der Tasten.
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21A (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21A_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD21A of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21A (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21A_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD21A of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21A (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21A_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD21A of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD21A of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_DREHSTELLER 0xD21B
// Logging of the rotary actuator (turning, tilting) / Logging des Drehstellers (Drehen, Kippen)
#define I3_RES_ZBE_STAT_RASTEN_IM_UHRZEIGERSINN_WERT (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_RASTEN_IM_UHRZEIGERSINN_WERT_TYPE unsigned long
// Number of notches in clockwise direction / Anzahl Rasten im Uhrzeigersinn
// Can't yet generate code for STAT_RELATIVZEIT_IM_UHRZEIGERSINN_DATA of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of the last counterclockwise rotation / Relativzeit der letzten Drehung gegen den Uhrzeigersinn
#define I3_RES_ZBE_STAT_RASTEN_GEGEN_UHRZEIGERSINN_WERT (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_RASTEN_GEGEN_UHRZEIGERSINN_WERT_TYPE unsigned long
// Number of notches counterclockwise / Anzahl Rasten gegen Uhrzeigersinn
// Can't yet generate code for STAT_RELATIVZEIT_GEGEN_UHRZEIGERSINN_DATA of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last counter-clockwise rotation / Relativzeit letzte Drehung gegen den Uhrzeigersinn
#define I3_RES_ZBE_STAT_UNDERFLOW_WERT (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_UNDERFLOW_WERT_TYPE unsigned long
// Number of underflows, stop on the left / Anzahl Underflow, Anschlag links
// Can't yet generate code for STAT_RELATIVZEIT_UNDERFLOW_DATA of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last underflow / Relativzeit letzter Underflow
#define I3_RES_ZBE_STAT_OVERFLOW_WERT (RXBUF_UINT32(24))
#define I3_RES_ZBE_STAT_OVERFLOW_WERT_TYPE unsigned long
// Number of overflows, stop on the right / Anzahl Overflow, Anschlag rechts
// Can't yet generate code for STAT_RELATIVZEIT_OVERFLOW_DATA of type data[4] at offset 28. But we account for the 4 bytes
// Relative time of last overflow / Relativzeit letzter Overflow
// Can't yet generate code for STAT_KM_DREH_DATA of type data[4] at offset 32. But we account for the 4 bytes
// KM status of the last shooting / KM-Stand der letzten Drehaktion
#define I3_PID_ZBE_LOGGING_DREHSTELLER_NORD 0xD21C
// Logging the keys / Logging der Tasten
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21C (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21C_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD21C of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21C (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21C_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD21C of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21C (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21C_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD21C of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD21C of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_DREHSTELLER_OST 0xD21D
// Logging the keys / Logging der Tasten
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21D (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21D_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD21D of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21D (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21D_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD21D of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21D (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21D_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD21D of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD21D of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_DREHSTELLER_SUED 0xD21E
// Logging the keys / Logging der Tasten
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21E (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21E_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD21E of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21E (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21E_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD21E of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21E (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21E_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD21E of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD21E of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_DREHSTELLER_WEST 0xD21F
// Logging the keys / Logging der Tasten
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21F (RXBUF_UINT32(0))
#define I3_RES_ZBE_STAT_ANZAHL_DRUCK_WERT_0XD21F_TYPE unsigned long
// Number of prints / Anzahl Druck
// Can't yet generate code for STAT_RELATIVZEIT_DRUCK_DATA_0XD21F of type data[4] at offset 4. But we account for the 4 bytes
// Relative time of last print / Relativzeit letzter Druck
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21F (RXBUF_UINT32(8))
#define I3_RES_ZBE_STAT_ANZAHL_LANGDRUCK_WERT_0XD21F_TYPE unsigned long
// Number of long presses / Anzahl Langdruck
// Can't yet generate code for STAT_RELATIVZEIT_LANGDRUCK_DATA_0XD21F of type data[4] at offset 12. But we account for the 4 bytes
// Relative time of the last long press / Relativzeit letzter Langdruck
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21F (RXBUF_UINT32(16))
#define I3_RES_ZBE_STAT_ANZAHL_HAENGER_WERT_0XD21F_TYPE unsigned long
// Number of hangers / Anzahl Hänger
// Can't yet generate code for STAT_RELATIVZEIT_HAENGER_DATA_0XD21F of type data[4] at offset 20. But we account for the 4 bytes
// Relative time of the last trailer / Relativzeit letzter Hänger
// Can't yet generate code for STAT_KM_DRUCK_DATA_0XD21F of type data[4] at offset 24. But we account for the 4 bytes
// KM status last print, long print or hanger / KM-Stand letzter Druck, Langdruck oder Hänger
#define I3_PID_ZBE_LOGGING_VERBAU 0xD228
// Read out when the component was installed / Auslesen, wann die Komponente verbaut wurde
// Can't yet generate code for STAT_RELATIVZEIT_VERBAU_DATA of type data[4] at offset 0. But we account for the 4 bytes
// Time of first installation / Zeit des Erstverbau
// Can't yet generate code for STAT_KM_VERBAU_DATA of type data[4] at offset 4. But we account for the 4 bytes
// KM stand during installation / KM-Stand beim Verbau
// Can't yet generate code for STAT_VIN_DATA of type data[7] at offset 8. But we account for the 7 bytes
// VIN / VIN
// Can't yet generate code for STAT_RELATIVZEIT_LETZTVERBAU_DATA of type data[4] at offset 15. But we account for the 4 bytes
// Relative time last installation / Relativzeit Letztverbau
// Can't yet generate code for STAT_KM_LETZTVERBAU_DATA of type data[4] at offset 19. But we account for the 4 bytes
// KM stand last installation / KM-Stand Letztverbau
// Can't yet generate code for STAT_VIN_LETZTVERBAU_DATA of type data[7] at offset 23. But we account for the 7 bytes
// Chassis number of the last installation / Fahrgestellnummer Letztverbau
// Skipping STEUERN_SIGNALMODE on 0xD598 which takes arguments
#define I3_PID_ZBE_TOUCHPAD_BERUEHRUNG 0xD60D
// Touch detection Touchpad: 0x00 = no touch detected 0x01 = touch detected / Berührungserkennung Touchpad: 0x00
// = keine Berührung erkannt 0x01 = Berührung erkannt
#define I3_RES_ZBE_STAT_TOUCHPAD_BERUEHRUNG (RXBUF_UCHAR(0))
#define I3_RES_ZBE_STAT_TOUCHPAD_BERUEHRUNG_UNIT '0/1'
#define I3_RES_ZBE_STAT_TOUCHPAD_BERUEHRUNG_TYPE unsigned char
// Touch detection Touchpad: 0x00 = no touch detected 0x01 = touch detected / Berührungserkennung Touchpad: 0x00
// = keine Berührung erkannt 0x01 = Berührung erkannt
// Skipping TOUCHPAD_AKTIVIERUNG on 0xD60E which takes arguments
#define I3_PID_ZBE_TOUCHPAD_ANNAEHERUNG 0xD68D
// Proximity detection touchpad: 0x00 = no proximity detected 0x01 = proximity detected / Annäherungsserkennung
// Touchpad: 0x00 = keine Annäherung erkannt 0x01 = Annäherung erkannt
#define I3_RES_ZBE_STAT_TOUCHPAD_ANNAEHERUNG (RXBUF_UCHAR(0))
#define I3_RES_ZBE_STAT_TOUCHPAD_ANNAEHERUNG_UNIT '0/1'
#define I3_RES_ZBE_STAT_TOUCHPAD_ANNAEHERUNG_TYPE unsigned char
// Proximity detection touchpad: 0x00 = no proximity detected 0x01 = proximity detected / Annäherungsserkennung
// Touchpad: 0x00 = keine Annäherung erkannt 0x01 = Annäherung erkannt
#define I3_PID_ZBE_SPANNUNG_KLEMME_30B_WERT 0xDAD9
// Voltage value on the control unit at terminal 30B (accurate to one decimal place) / Spannungswert am
// Steuergerät an Klemme 30B (auf eine Nachkommastelle genau)
#define I3_RES_ZBE_STAT_SPANNUNG_KLEMME_30B_WERT (RXBUF_UINT(0)/10.0f)
#define I3_RES_ZBE_STAT_SPANNUNG_KLEMME_30B_WERT_UNIT 'V'
#define I3_RES_ZBE_STAT_SPANNUNG_KLEMME_30B_WERT_TYPE float
// Voltage value on the control unit at terminal 30B (accurate to one decimal place) / Spannungswert am
// Steuergerät an Klemme 30B (auf eine Nachkommastelle genau)
#define I3_PID_ZBE_ACTIVE_DIAGNOSTIC_SESSION 0xF186
// activeDiagnosticSession / activeDiagnosticSession
#define I3_RES_ZBE_STAT_ACTIVE_DIAGNOSTIC_SESSION (RXBUF_UCHAR(0))
#define I3_RES_ZBE_STAT_ACTIVE_DIAGNOSTIC_SESSION_UNIT '0-n'
#define I3_RES_ZBE_STAT_ACTIVE_DIAGNOSTIC_SESSION_TYPE unsigned char
// activeDiagnosticSession / activeDiagnosticSession

View File

@ -1,29 +0,0 @@
//
// Warning: don't edit - generated by generate_ecu_code.pl processing ../dev/zbe6.json: ZBE 67: iDrive controller
// This generated code makes it easier to process CANBUS messages from the ZBE ecu in a BMW i3
//
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_PROGRAMMING_COUNTER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x2502
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_PROGRAMMING_COUNTER_MAX_VALUE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x2503
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_FLASH_TIMING_PARAMETER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x2504
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_MILE_KM_EEPROM, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0x2540
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_VARIANTE_ZBE, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD137
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_SCHRITTE_ROTRAD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD14E
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_TASTE1, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD213
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_TASTE2, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD214
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_TASTE3, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD215
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_TASTE4, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD216
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_TASTE5, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD217
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_TASTE6, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD218
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_TASTE7, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD219
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_TASTE8, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD21A
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_DREHSTELLER, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD21B
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_DREHSTELLER_NORD, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD21C
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_DREHSTELLER_OST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD21D
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_DREHSTELLER_SUED, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD21E
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_DREHSTELLER_WEST, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD21F
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_LOGGING_VERBAU, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD228
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_TOUCHPAD_BERUEHRUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD60D
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_TOUCHPAD_ANNAEHERUNG, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xD68D
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_SPANNUNG_KLEMME_30B_WERT, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xDAD9
//{ I3_ECU_ZBE_TX, I3_ECU_ZBE_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_ZBE_ACTIVE_DIAGNOSTIC_SESSION, { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // 0xF186

File diff suppressed because it is too large Load Diff

View File

@ -1,146 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 14th March 2017
;
; OVMS Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
;
; BMW I3 component:
; Developed by Stephen Davies <steve@telviva.co.za>
;
; 2020-12-12 0.0 Work started
; 2021-01-04 Ready to merge as first version
;
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#ifndef __VEHICLE_BMWI3_H__
#define __VEHICLE_BMWI3_H__
#include "vehicle.h"
using namespace std;
// rxbuff access macros: b=byte# 0..7 / n=nibble# 0..15
#define RXBUF_BYTE(b) (rxbuf[b])
#define RXBUF_UCHAR(b) ((unsigned char)RXBUF_BYTE(b))
#define RXBUF_SCHAR(b) ((signed char)RXBUF_BYTE(b))
#define RXBUF_UINT(b) (((UINT)RXBUF_BYTE(b) << 8) | RXBUF_BYTE(b+1))
#define RXBUF_SINT(b) ((short)RXBUF_UINT(b))
#define RXBUF_UINT24(b) (((uint32_t)RXBUF_BYTE(b) << 16) | ((UINT)RXBUF_BYTE(b+1) << 8) | RXBUF_BYTE(b+2))
#define RXBUF_UINT32(b) (((uint32_t)RXBUF_BYTE(b) << 24) | ((uint32_t)RXBUF_BYTE(b+1) << 16) | ((UINT)RXBUF_BYTE(b+2) << 8) | RXBUF_BYTE(b+3))
#define RXBUF_SINT32(b) ((int32_t)RXBUF_UINT32(b))
#define RXBUF_NIBL(b) (rxbuff[b] & 0x0f)
#define RXBUF_NIBH(b) (rxbuff[b] >> 4)
#define RXBUF_NIB(n) (((n)&1) ? RXBUF_NIBL((n)>>1) : RXBUF_NIBH((n)>>1))
#define POLLSTATE_SHUTDOWN 0
#define POLLSTATE_ALIVE 1
#define POLLSTATE_READY 2
#define POLLSTATE_CHARGING 3
class OvmsVehicleBMWi3 : public OvmsVehicle
{
public:
OvmsVehicleBMWi3();
~OvmsVehicleBMWi3();
void CanResponder(const CAN_frame_t* p_frame);
void Ticker1(uint32_t ticker);
void Ticker10(uint32_t ticker);
protected:
string bmwi3_obd_rxbuf; // CAN messages unpacked into here
float hv_volts; // Traction battery voltage - used to calculate power from current
float soc = 0.0f; // Remember SOC for derivative calcs
int framecount = 0, tickercount = 0, replycount = 0; // Keep track of when the car is talking or schtum.
int eps_messages = 0; // Is the EPS (power steering) alive? If so we are "on"
int pollerstate; // What pollerstate we are in
int last_obd_data_seen; // "monotonic" value last time we saw data
// Local metrics
// Wheel speeds
OvmsMetricFloat *mt_i3_wheel1_speed;
OvmsMetricFloat *mt_i3_wheel2_speed;
OvmsMetricFloat *mt_i3_wheel3_speed;
OvmsMetricFloat *mt_i3_wheel4_speed;
OvmsMetricFloat *mt_i3_wheel_speed; // "Combined" the car calls it. Not sure how its combined
// Charge limits
OvmsMetricFloat *mt_i3_charge_actual;
OvmsMetricFloat *mt_i3_charge_max;
OvmsMetricFloat *mt_i3_charge_min;
// Cell OCV (Open circuit voltage) stats
OvmsMetricFloat *mt_i3_batt_pack_ocv_avg;
OvmsMetricFloat *mt_i3_batt_pack_ocv_min;
OvmsMetricFloat *mt_i3_batt_pack_ocv_max;
// Ranges
OvmsMetricInt *mt_i3_range_bc;
OvmsMetricInt *mt_i3_range_comfort;
OvmsMetricInt *mt_i3_range_ecopro;
OvmsMetricInt *mt_i3_range_ecoproplus;
// Charging
OvmsMetricInt *mt_i3_v_charge_voltage_phase1;
OvmsMetricInt *mt_i3_v_charge_voltage_phase2;
OvmsMetricInt *mt_i3_v_charge_voltage_phase3;
OvmsMetricFloat *mt_i3_v_charge_voltage_dc;
OvmsMetricFloat *mt_i3_v_charge_voltage_dc_limit;
OvmsMetricFloat *mt_i3_v_charge_current_phase1;
OvmsMetricFloat *mt_i3_v_charge_current_phase2;
OvmsMetricFloat *mt_i3_v_charge_current_phase3;
OvmsMetricFloat *mt_i3_v_charge_current_dc;
OvmsMetricFloat *mt_i3_v_charge_current_dc_limit;
OvmsMetricFloat *mt_i3_v_charge_current_dc_maxlimit;
OvmsMetricInt *mt_i3_v_charge_deratingreasons;
OvmsMetricInt *mt_i3_v_charge_faults;
OvmsMetricInt *mt_i3_v_charge_failsafetriggers;
OvmsMetricInt *mt_i3_v_charge_interruptionreasons;
OvmsMetricInt *mt_i3_v_charge_errors;
OvmsMetricBool *mt_i3_v_charge_readytocharge;
OvmsMetricString *mt_i3_v_charge_plugstatus;
OvmsMetricInt *mt_i3_v_charge_pilotsignal;
OvmsMetricInt *mt_i3_v_charge_cablecapacity;
OvmsMetricBool *mt_i3_v_charge_dc_plugconnected;
OvmsMetricInt *mt_i3_v_charge_chargeledstate;
OvmsMetricInt *mt_i3_v_charge_dc_voltage;
OvmsMetricInt *mt_i3_v_charge_dc_controlsignals;
OvmsMetricBool *mt_i3_v_door_dc_chargeport;
OvmsMetricBool *mt_i3_v_charge_dc_inprogress;
OvmsMetricString *mt_i3_v_charge_dc_contactorstatus;
OvmsMetricInt *mt_i3_v_charge_temp_gatedriver;
// Trip consumption
OvmsMetricInt *mt_i3_v_pos_tripconsumption;
// Cabin aircon
OvmsMetricBool *mt_i3_v_env_autorecirc;
// State
OvmsMetricBool *mt_i3_obdisalive;
OvmsMetricInt *mt_i3_pollermode;
OvmsMetricInt *mt_i3_age;
void IncomingPollReply(canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain);
};
#endif //#ifndef __VEHICLE_BMWI3_H__

View File

@ -1,329 +0,0 @@
#! /usr/bin/perl -w
no warnings 'experimental::smartmatch';
use File::Slurp;
use Data::Dumper;
use JSON::PP;
our $DEBUG = 0;
# Optionally you can pass a PID to match in which case you get that one only
our @MATCH_PIDS = ();
if (scalar(@ARGV) > 3) {
@MATCH_PIDS = @ARGV[3..scalar(@ARGV)-1];
@MATCH_PIDS = map { uc($_) } @MATCH_PIDS;
}
our $types = {
'signed char' => 'SCHAR',
'unsigned char' => 'UCHAR',
'char' => 'UCHAR',
'signed int' => 'SINT',
'unsigned int' => 'UINT',
'int' => 'UINT',
'long' => 'SINT32',
'signed long' => 'SINT32',
'unsigned long' => 'UINT32'
};
our $sizes = {
'signed char' => 1,
'unsigned char' => 1,
'char' => 1,
'signed int' => 2,
'unsigned int' => 2,
'int' => 2,
'long' => 4,
'signed long' => 4,
'unsigned long' => 4
};
our $ctypes = {
'signed char' => 'char',
'unsigned char' => 'unsigned char',
'char' => 'char',
'signed int' => 'short',
'unsigned int' => 'unsigned short',
'int' => 'unsigned short',
'signed long' => 'long',
'long' => 'long',
'unsigned long' => 'unsigned long',
'BITFIELD' => 'HANDLED SEPARATELY'
};
# These map from the C++ types!
our $formats = {
'char' => '%x',
'unsigned char' => '%x',
'short' => '%d',
'unsigned short' => '%u',
'long' => '%ld',
'unsigned long' => '%lu',
'float' => "%.4f",
'string?' => "%s"
};
our $blacklist = {
# 'KUEHLDAUER_HVB' => 1 # Obsolete and dupe
};
# We sometimes get duplicate result names - in that case we dedupe them by added the ID that they are returned from
our $usedfunctionnames = {};
our $usedresultnames = {};
open (CODE, ">&=3") || die "Can't fdopen 3";
open (POLLLIST, ">&=4") || die "Can't fdopen 4";
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
binmode(CODE, ":utf8");
binmode(POLLLIST, ":utf8");
# Read ECU definition json as created by parseecu.pl
my $tables;
{
my $jsonpp = JSON::PP->new->utf8;
my $json = read_file($ARGV[0]);
$tables = $jsonpp->decode($json);
}
our $ECU = $ARGV[1] || $tables->{'ovmscode'} || "???";
our $ECUID = $ARGV[2] || $tables->{'ovmsextaddr'} || "??";
our $ECUDESC = $tables->{'ovmsdesc'} || "ECU: $ECU";
print STDERR "Generating OVMS config for ECU $ECU on id $ECUID: $ECUDESC\n";
# Dump header
foreach my $FD (*STDOUT, *CODE, *POLLLIST) {
print $FD "
//
// Warning: don't edit - generated by generate_ecu_code.pl processing $ARGV[0]: $ECU $ECUID: $ECUDESC
// This generated code makes it easier to process CANBUS messages from the $ECU ecu in a BMW i3
//";
}
print "
#define I3_ECU_${ECU}_TX 0x06F1${ECUID}
#define I3_ECU_${ECU}_RX 0x06${ECUID}F1";
$tables = $tables->{'tables'};
my $functions = $tables->{'SG_FUNKTIONEN'};
my $need_nl = 0;
# Read through the functions
foreach my $function (@$functions) {
my $functionname = $function->{ARG};
# Filter
if (scalar(@MATCH_PIDS)) {
print STDERR "checking " .
next unless (uc($function->{ID}) ~~ @MATCH_PIDS);
}
# For now skip those that take arguments (which are actually some of the most interesting)
$need_nl = 1;
if ($function->{ARG_TABELLE} && $function->{ARG_TABELLE} ne '-') {
if ($need_nl) { print "\n"; $need_nl = 0; }
print "\n// Skipping " . $functionname . " on " . $function->{ID} . " which takes arguments";
next;
}
# And skip those marked as obsolete
if ($function->{INFO} =~ /^Dieser Job ist nicht mehr angefordert und wird nicht mehr/) {
if ($need_nl) { print "\n"; $need_nl = 0; }
print "\n// Skipping " . $functionname . " on " . $function->{ID} . " INFO says it's obsolete";
next;
}
# And skip those blacklisted
if ($blacklist->{$functionname}) {
if ($need_nl) { print "\n"; $need_nl = 0; }
print "\n// Skipping " . $functionname . " on " . $function->{ID} . ": Blacklisted";
next;
}
if ($need_nl) { print "\n"; $need_nl = 0; }
# Uniqueify function name (there are dupes, though I'm sure there shouldn't be)
if ($usedfunctionnames->{$functionname}) {
$functionname = $functionname . '_'. uc($function->{ID});
print STDERR "De-duped function " . $function->{ARG} . " as $functionname\n";
}
$usedfunctionnames->{$functionname} = 1;
my $desc = format_desc($function->{INFO_EN}, $function->{INFO});
if ($DEBUG) {
print Dumper($function);
if ($function->{ARG_TABELLE} && $function->{ARG_TABELLE} ne '-') {
print Dumper({ arg_table => $tables->{uc($function->{ARG_TABELLE})} });
}
if ($function->{RES_TABELLE} && $function->{RES_TABELLE} ne '-') {
print Dumper({ res_table => $tables->{uc($function->{RES_TABELLE})} });
}
}
printf "\n#define I3_PID_%s_%-49s %6s", $ECU, $functionname, $function->{ID};
print "\n // $desc" if ($desc ne '');
# write the code
printf(CODE "%-80s // %s", "\n\n case I3_PID_${ECU}_" . $functionname . ": {", $function->{ID});
# Now deal with the results
my $results = $function->{RES_TABELLE};
$results = $tables->{uc($results)};
if (! $results) {
# Might just be a single result
if ($function->{DATENTYP} && $function->{DATENTYP} ne '-') {
$results = [ $function ];
Dumper($results);
}
}
if ($results) {
my $offset = 0;
my @codelines;
foreach my $result (@$results) {
print "\n";
print STDERR Dumper({result => $result}) if ($DEBUG);
my $desc = format_desc($result->{INFO_EN}, $result->{INFO});
my $datatype = $result->{DATENTYP};
my $mul = $result->{MUL};
my $div = $result->{DIV};
my $add = $result->{ADD};
my $unit = $result->{EINHEIT};
my $resultname = $result->{RESULTNAME};
$resultname = $result->{NAME} unless ($resultname && $resultname ne "-");
# De-dupe it
if ($usedresultnames->{$resultname}) {
print STDERR "De-duped result $resultname as " . uc($function->{ID}) . "_" . $resultname . "\n";
$resultname = $resultname . '_' . uc($function->{ID});
}
$usedresultnames->{$resultname} = 1;
# Build the macro expansion including any manipulations.
my $expr;
my $ctype;
if ($datatype =~ /^data\[(\d+)\]$/) {
print "\n // Can't yet generate code for $resultname of type $datatype at offset $offset. But we account for the $1 bytes";
print "\n // $desc" if ($desc ne '');
$offset += $1;
}
elsif ($datatype =~ /^string\[(\d+)\]$/) {
print "\n // Can't yet generate code for $resultname of type $datatype, at offset $offset. But we account for the $1 bytes";
print "\n // $desc" if ($desc ne '');
$offset += $1;
}
elsif (! $ctypes->{$datatype} ) {
print "\n // Can't process $resultname - don't know type $datatype (*** this will mean all the following offsets are wrong!!! ****)";
} else {
# For a bitfield we can look up the bit definitions.
my $isbitfield = 0;
my $bits;
if ($datatype eq "BITFIELD") {
$isbitfield = 1;
$bits = $tables->{$resultname};
# print Dumper({ "resultname" => $resultname, "datatype" => $datatype, "bitsdesc" => $bits});
if ($bits && $bits->[0]) {
$datatype = $bits->[0]->{DATENTYP};
print "\n // $resultname is a BITFIELD of size $datatype. We don't yet generate definitions for each bit, we treat as the host data type";
print "\n // $desc" if ($desc ne '');
foreach my $bit (@$bits) {
print "\n // " . $bit->{RESULTNAME} . ": Mask: " . $bit->{MASKE} . " - " . $bit->{INFO_EN};
}
} else {
$datatype = "unsigned char";
print "\n // $resultname is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***";
print "\n // $desc" if ($desc ne '');
}
}
$ctype = $ctypes->{$datatype};
$expr = '(RXBUF_' . $types->{$datatype} . '(' . $offset . ')';
if ($mul ne '-' && $mul != 1) {
$expr .= '*' . $mul . 'f';
$ctype = 'float';
}
if ($div ne '-' && $div != 1) {
$expr .= '/' . $div . 'f';
$ctype = 'float';
}
$expr .= (($add > 0) ? '+' : '') . $add if ($add ne '-' && $add != 0);
$expr .= ')';
$offset += $sizes->{$datatype};
printf "\n #define I3_RES_%s_%-45s %s", $ECU, $resultname, $expr;
printf "\n #define I3_RES_%s_%-45s '%s'", $ECU, $resultname . '_UNIT', $unit if ($unit && $unit ne '-');
printf "\n #define I3_RES_%s_%-45s %s", $ECU, $resultname . '_TYPE', $ctype if ($ctype);
print "\n // $desc" if ($desc ne '');
# code
push @codelines, "\n $ctype $resultname = $expr;\n";
push @codelines, " // $desc\n";
if ($isbitfield) {
if ($bits && $bits->[0]) {
push @codelines, " // $resultname is a BITFIELD of size $datatype. We don't yet generate definitions for each bit, we treat as the host data type\n";
foreach my $bit (@$bits) {
push @codelines, " // " . $bit->{RESULTNAME} . ": Mask: " . $bit->{MASKE} . " - " . $bit->{INFO_EN} . "\n";
}
} else {
push @codelines, " // $resultname is a BITFIELD of unknown size. We don't have definitions for each bit, and we GUESSED it is one byte ***\n";
}
}
print STDERR "Don't have format for $ctype\n" unless ($formats->{$ctype});
push @codelines, " ESP_LOGD(TAG, \"From ECU %s, pid %s: got %s=" . ($isbitfield ? "%lx" : $formats->{$ctype}) . "%s\\n\", \"$ECU\", \"" . $functionname . "\", \"$resultname\", " . ($isbitfield ? "(unsigned long)" : "") . "$resultname, " . (($unit && $unit ne "-") ? "\"\\\"$unit\\\"\"" : "\"\"") . ");\n";
}
}
# code
print CODE "\n if (datalen < $offset) {\n ESP_LOGW(TAG, \"Received %d bytes for %s, expected %d\", datalen, \"I3_PID_${ECU}_" . $functionname . "\", $offset);\n break;\n }";
print CODE "\n" . join('', @codelines);
}
# code
print CODE "\n // ========== Add your processing here ==========\n";
print CODE " hexdump(rxbuf, type, pid);\n";
print CODE "\n break;\n }";
# polllist
printf POLLLIST "\n%-120s %s", " //{ I3_ECU_${ECU}_TX, I3_ECU_${ECU}_RX, VEHICLE_POLL_TYPE_OBDIIEXTENDED, I3_PID_${ECU}_" . $functionname . ",", " { 0, 0, 0, 0 }, 0, ISOTP_EXTADR }, // " . $function->{ID};
}
print "\n";
print POLLLIST "\n";
print CODE "\n";
sub format_desc {
my ($en, $de) = @_;
my $desc = $en || '';
if ($desc eq '') {
$desc = $de || '';
} else {
$desc .= " / " . $de if ($de);
}
if ($desc && $desc ne '') {
$desc =~ s/(.{1,110}|\S{111,})(?:\s[^\S\r\n]*|\Z)/$1\n \/\/ /g if (length $desc >= 110);
$desc =~ s/(\n \/\/ )?$//;
}
return $desc;
}
# 'result' => {
# 'MASKE' => '-',
# 'INFO' => "\x{c3}\x{9c}berlastz\x{c3}\x{a4}hler Sch\x{c3}\x{bc}tz K1",
# 'DATENTYP' => 'unsigned int',
# 'MUL' => '1.0',
# 'INFO_EN' => 'Overload counter contactor K1',
# 'ADD' => '0.0',
# 'RESULTNAME' => 'STAT_OVERLOAD_K1_WERT',
# 'NAME' => '-',
# 'L/H' => 'high',
# 'DIV' => '1.0',
# 'EINHEIT' => '-'
# }

View File

@ -1,49 +0,0 @@
#! /bin/bash
# Still unclear:
# 01 ? Initialisation sends 010319020C000000 and gets 0601 F1 03 5902FF
# 06 ? Initialisation sends 060319020C000000 and gets 0606 F1 03 5902FF -> same
# 2C ? Same init thing as above
# 2D ? Ditto
# 37 ? Same init thing
# 43 ? And again
# 44 ? Again
# 61 ? And again
# Identified:
# 07 SME Battery management electronics
# 10 ZGW
# 12 EDME Electrical digital motor electronics (low voltage ECU)
# 14 LIM Charging interface module (this is the actual connector at the back of the car)
# 15 UCX2 Convenience charging electronics (the ac charger for the main battery)
# 1A EME Electrical machine electronics (motor controller etc)
# 22 SAS Optional equipment system (TPMS)
# 29 DSC Dynamic stability control
# 30 EPS Electromechanical power steering
# 35 TBX5
# 40 BDC The body domain controller
# 56 FZD Roof function center (seems to be the alarm mostly)
# 5D KAFAS Camera based driver assist system
# 5E GWS Gear selector switch
# 60 KOMBI Instrument panel
# 63 NBTEVO Headunit high (is this the mid-mounted display)
# 67 ZBE6 iDrive controller
# 78 IHX Integrated automatic heating / aircon - though its mainly the buttons I think)
perl ./generate_ecu_code.pl ../dev/sme_i1.json >../ecu_definitions/ecu_sme_defines.h 3>../ecu_definitions/ecu_sme_code.cpp 4>../ecu_definitions/ecu_sme_polls.cpp
perl ./generate_ecu_code.pl ../dev/edmei1.json >../ecu_definitions/ecu_edm_defines.h 3>../ecu_definitions/ecu_edm_code.cpp 4>../ecu_definitions/ecu_edm_polls.cpp
perl ./generate_ecu_code.pl ../dev/lim_i1.json >../ecu_definitions/ecu_lim_defines.h 3>../ecu_definitions/ecu_lim_code.cpp 4>../ecu_definitions/ecu_lim_polls.cpp
perl ./generate_ecu_code.pl ../dev/ucx2_i01.json >../ecu_definitions/ecu_kle_defines.h 3>../ecu_definitions/ecu_kle_code.cpp 4>../ecu_definitions/ecu_kle_polls.cpp
perl ./generate_ecu_code.pl ../dev/eme_i01.json >../ecu_definitions/ecu_eme_defines.h 3>../ecu_definitions/ecu_eme_code.cpp 4>../ecu_definitions/ecu_eme_polls.cpp
perl ./generate_ecu_code.pl ../dev/sas_i1.json >../ecu_definitions/ecu_sas_defines.h 3>../ecu_definitions/ecu_sas_code.cpp 4>../ecu_definitions/ecu_sas_polls.cpp
perl ./generate_ecu_code.pl ../dev/dsc_i1.json >../ecu_definitions/ecu_dsc_defines.h 3>../ecu_definitions/ecu_dsc_code.cpp 4>../ecu_definitions/ecu_dsc_polls.cpp
perl ./generate_ecu_code.pl ../dev/bdc.json >../ecu_definitions/ecu_bdc_defines.h 3>../ecu_definitions/ecu_bdc_code.cpp 4>../ecu_definitions/ecu_bdc_polls.cpp
perl ./generate_ecu_code.pl ../dev/fzd_f15.json >../ecu_definitions/ecu_fzd_defines.h 3>../ecu_definitions/ecu_fzd_code.cpp 4>../ecu_definitions/ecu_fzd_polls.cpp
perl ./generate_ecu_code.pl ../dev/kafas20.json >../ecu_definitions/ecu_kaf_defines.h 3>../ecu_definitions/ecu_kaf_code.cpp 4>../ecu_definitions/ecu_kaf_polls.cpp
perl ./generate_ecu_code.pl ../dev/komb25.json >../ecu_definitions/ecu_kom_defines.h 3>../ecu_definitions/ecu_kom_code.cpp 4>../ecu_definitions/ecu_kom_polls.cpp
perl ./generate_ecu_code.pl ../dev/nbtevo.json >../ecu_definitions/ecu_nbt_defines.h 3>../ecu_definitions/ecu_nbt_code.cpp 4>../ecu_definitions/ecu_nbt_polls.cpp
perl ./generate_ecu_code.pl ../dev/zbe6.json >../ecu_definitions/ecu_zbe_defines.h 3>../ecu_definitions/ecu_zbe_code.cpp 4>../ecu_definitions/ecu_zbe_polls.cpp
perl ./generate_ecu_code.pl ../dev/ihx_i1.json >../ecu_definitions/ecu_ihx_defines.h 3>../ecu_definitions/ecu_ihx_code.cpp 4>../ecu_definitions/ecu_ihx_polls.cpp
perl ./generate_ecu_code.pl ../dev/eps_i1.json >../ecu_definitions/ecu_eps_defines.h 3>../ecu_definitions/ecu_eps_code.cpp 4>../ecu_definitions/ecu_eps_polls.cpp

View File

@ -1,97 +0,0 @@
#! /usr/bin/perl
use WWW::Google::Translate;
use File::Slurp;
use Data::Dumper;
use JSON::PP;
use utf8;
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
# ------ TRANSLATION ---------------------------------------------------------------------------
my $google_translate_api_key = "YOUR-KEY-GOES-HERE";
my $de_to_en = WWW::Google::Translate->new({
key => $google_translate_api_key,
default_source => 'de',
default_target => 'en'
});
my %previous_translations;
sub de_to_en {
($text_de) = @_;
my $previously = $previous_translations{$text_de};
return $previously if ($previously);
my $en = $de_to_en->translate({ q=>$text_de });
#print Dumper($en);
if ($en->{data} && $en->{data}->{translations}) {
my $ent = $en->{data}->{translations}[0]{translatedText};
$previous_translations{$text_de} = $ent;
return $ent;
}
}
sub test_translation {
my $de = "17-stellige Fahrgestellnummer. Zum Zurücksetzen im Steuergerät wird das Argument '00000000000000000' verwendet. Hinweis: Der Argumentwert '00000000000000000' wird SGBD-intern in 0xFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF gewandelt, bevor er an das CAS gesendet wird.";
my $en = de_to_en($de);
print "$de\n$en\n";
print de_to_en("Differenz zwischen dem mittleren und minimalen Ladezsustand aller Zellen bezogen auf Nennkapazität") . "\n";
my $en = de_to_en($de);
print "Again:\n$de\n$en\n";
}
# test_translation;
# exit 99;
# ------ TRANSLATION ---------------------------------------------------------------------------
# ------ READ ECU DESCRIPTION -----------------------------------------------------------------
my $tables = {};
my $tablename;
my $table;
my @headings;
while (<>) {
chomp($_);
if ( $_ eq "TEND" ) {
$tables->{$tablename} = $table;
$table = undef;
}
elsif ( $_ =~ /^TBEG *"(.*?)"/ ) {
$tablename = $1;
$table = [];
print STDERR "$tablename\n";
}
elsif ( $_ =~ /^HEAD *"(.*?)"$/ ) {
# $1 =~ s/^"//; $1 =~ s/"$//;
@headings = split(/", ?"/, $1);
}
elsif ( $_ =~ /^LINE *"(.*?)"$/ ) {
my %line;
@line{@headings} = split(/", ?"/, $1);
foreach my $name ( qw(INFO TEXT ORTTEXT ARTTEXT) ) {
if ($line{$name} && $line{$name} ne '' ) { # && $tablename eq "SG_FUNKTIONEN") {
$line{"${name}_EN"} = de_to_en($line{$name});
}
}
push $table, \%line;
}
}
# ------ SHOW RESULTS -------------------------------------------------------------------------
print STDERR Dumper($tables->{"SG_FUNKTIONEN"});
my $json = JSON::PP->new->pretty; # ->utf8(true);
print $json->encode( { tables => $tables } );

View File

@ -1,14 +0,0 @@
#
# Main component makefile.
#
# This Makefile can be left empty. By default, it will take the sources in the
# src/ directory, compile them and link them into lib(subdirectory_name).a
# in the build directory. This behaviour is entirely configurable,
# please read the ESP-IDF documents if you need to do this.
#
ifdef CONFIG_OVMS_VEHICLE_BOLTEV
COMPONENT_ADD_INCLUDEDIRS:=src
COMPONENT_SRCDIRS:=src
COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
endif

View File

@ -1,434 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 16th August 2019
;
; Changes:
; 1.0 Initial release
;
; (C) 2019 Marko Juhanne
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "ovms_log.h"
static const char *TAG = "v-boltev";
#include <stdio.h>
#include "ovms_config.h"
#include "vehicle_boltev.h"
#include "canutils.h"
#define VA_PREHEAT_STOPPED 0
#define VA_PREHEAT_STARTING 1
#define VA_PREHEAT_SWITCH_ON 2 // Used only for overriding BCM
#define VA_PREHEAT_STARTED 3
#define VA_PREHEAT_STOPPING 4
#define VA_PREHEAT_ERROR 5
#define VA_PREHEAT_RELINQUISH 6 // Used only when preheating is activated via key fob while BCM overriding is on-going
const char* const va_preheat_status_strings[] = {
"Stopped",
"Starting",
"Switch on",
"Started",
"Stopping",
"Error"
};
#define VA_PREHEAT_TIMEOUT 15 //seconds
#define VA_PREHEAT_MAX_TIME_DEFAULT 20 // minutes
#define VA_PREHEAT_MAX_RETRIES 3
#define VA_PREHEAT_LIGHTS_ACTIVE (va_light_t)(Park)
#define VA_PREHEAT_LIGHTS_STARTSTOP (va_light_t)(Driver_front_signal | Passenger_front_signal | Left_rear_signal | Right_rear_signal )
#define VA_PREHEAT_LIGHTS_ERROR VA_PREHEAT_LIGHTS_STARTSTOP
#define BCM_OVERRIDE_IGNORE_PERIOD 3000 // milliseconds
#define BCM_OVERRIDE_RELAUNCH_PERIOD 10000 // milliseconds
const char * OvmsVehicleBoltEV::PreheatStatus()
{
return va_preheat_status_strings[ mt_preheat_status->AsInt() ];
}
void OvmsVehicleBoltEV::ClimateControlInit()
{
// New VA specific metrics
mt_preheat_status = MyMetrics.InitInt("xcb.v.ac.preheat", SM_STALE_MIN, VA_PREHEAT_STOPPED);
mt_preheat_timer = MyMetrics.InitInt("xcb.v.ac.preheat_timer", SM_STALE_MIN, 0);
mt_ac_active = MyMetrics.InitBool("xcb.v.ac.active", SM_STALE_MIN, 0);
mt_ac_front_blower_fan_speed = MyMetrics.InitInt("xcb.v.ac.front_blower_fan_speed", SM_STALE_MIN, 0, Percentage);
m_preheat_commander = Disabled;
}
void OvmsVehicleBoltEV::ClimateControlPrintStatus(int verbosity, OvmsWriter* writer)
{
writer->printf("Preheat status: %s - Cabin temperature %2.1f\n", PreheatStatus(), StandardMetrics.ms_v_env_cabintemp->AsFloat());
}
void OvmsVehicleBoltEV::ClimateControlIncomingSWCAN(CAN_frame_t* p_frame)
{
uint8_t *d = p_frame->data.u8;
bool unexpected_data = false;
// Process the incoming message
switch (p_frame->MsgID) {
// Front seat heat cool control
case 0x107220A9: {
if ( (d[0]==0) && (d[1]==0) )
ESP_LOGD(TAG,"Driver and passenger seat heater off");
else
ESP_LOGD(TAG,"Seat heaters %02x / %02x", d[2],d[3]);
break;
}
// Fob status
case 0x10718040: {
uint16_t fob_func = ((GET16(p_frame,0))>>1) & 0x3f;
bool fob_low_batt = d[1] & 0x1;
uint8_t fob_number = ((GET16(p_frame,0))>>7) & 0x3;
ESP_LOGD(TAG,"Fob key press. Fob #%d func #%d low_batt %d", fob_number, fob_func, fob_low_batt);
switch (fob_func) {
case 1: {
ESP_LOGI(TAG,"Fob key press: LOCK");
break;
}
case 3: {
ESP_LOGI(TAG,"Fob key press: UNLOCK");
if (m_preheat_commander==OVMS) {
// Turn off preheating
ESP_LOGI(TAG,"<--- Turn off preheating due to fob unlock cmd ---->");
PreheatModeChange(VA_PREHEAT_STOPPING);
}
break;
}
case 8: {
ESP_LOGI(TAG,"Fob key press: OPEN CHARGER PORT");
break;
}
case 11: {
ESP_LOGI(TAG,"Fob key press: PREHEAT");
if (m_preheat_commander==OVMS) {
ESP_LOGI(TAG,"<--- Relinquish the control of the preheating to BCM ---->");
PreheatModeChange(VA_PREHEAT_RELINQUISH);
}
break;
}
case 12: {
// This is sent when long pressing the warming button did not cause BCM to start preheating
ESP_LOGI(TAG,"Fob key press: WARM BTN LONG PRESS");
break;
}
default: {
ESP_LOGW(TAG,"Fob key press: unknown %d",fob_func);
}
}
break;
}
// Coolant Heater Status
case 0x1047809D: {
mt_coolant_heater_pwr->SetValue((float)d[1]*0.02);
break;
}
// Climate control general status
case 0x10734099: {
uint8_t mode = (d[0] >> 4) & 3;
// this flag is active when AC is turned on from dashboard, or when preheat is initiated via fob or via Onstar (but NOT when overriding BCM)
if (mode==1) {
mt_ac_active->SetValue(false);
} else if (mode==2) {
mt_ac_active->SetValue(true);
} else
unexpected_data = true;
// Incorrect DBC entry: This is not absolute target temperature but some kind of differential temp. Needs more investigating..
//mt_ac_target_temp->SetValue( (GET16(p_frame, 2) & 0x3ff) / 10 - 10);
break;
}
// Climate Control Basic Status
case 0x10814099: {
// Blower fan speed is the only reliable indicator (that I know of) of whether preheat is switched on or not, since
// the Climate_control_general_status:ac_active flag is not set if we override BCM...
bool ac_status = mt_ac_front_blower_fan_speed->AsInt() > 0;
mt_ac_front_blower_fan_speed->SetValue( (float)d[1]*0.39 );
AirConStatusUpdated(ac_status);
// this flag is active only when turning AC on manually on the dashboard, but NOT when preheating
//mt_ac_active->SetValue( (d[0]>>5)&1 );
break;
}
// Alarm_2_Request_LS (provides us with estimated cabin temperature)
case 0x10440099: {
// This is estimated roof surface temperature
ESP_LOGI(TAG,"Cabin temp: %f",(float)d[5]/2 - 40);
StandardMetrics.ms_v_env_cabintemp->SetValue( (float)d[5]/2 - 40 );
// There is also estimated bulk internal air temperature, but for comfort I think we prefer the surface temperature
//StandardMetrics.ms_v_env_cabintemp->SetValue( (float)d[4]/2 - 40 );
// this flag is active only when turning AC on manually on the dashboard, but NOT when preheating
//mt_ac_active->SetValue( (d[0]>>5)&1 );
break;
}
// Remote start status (Preheating)
case 0x10390040: {
if (d[0]==0)
// Remote start off
{
if ((mt_preheat_status->AsInt()==VA_PREHEAT_STARTING) || (mt_preheat_status->AsInt()==VA_PREHEAT_STARTED) ) {
if (m_preheat_commander==OVMS) {
ESP_LOGW(TAG,"BCM attempted to turn off preheating. Overriding by sending new start message...");
PreheatModeChange(VA_PREHEAT_SWITCH_ON);
} else {
if ( (m_preheat_commander==Onstar) && (mt_preheat_status->AsInt()==VA_PREHEAT_STARTING) ) {
ESP_LOGW(TAG,"BCM sending preheating off msg while trying to start? Ignoring for now..");
} else {
ESP_LOGW(TAG,"BCM switching preheat off (after maximum time-on?)");
PreheatModeChange(VA_PREHEAT_STOPPING);
}
}
}
} else if ( (d[0]>>1) & 1)
// Remote start request
{
// Preheat switched on most likely via key fob
ESP_LOGI(TAG,"Preheating initiated by BCM (via key fob?)");
m_preheat_commander = Fob;
PreheatModeChange(VA_PREHEAT_STARTING);
}
break;
}
default:
break;
}
if (unexpected_data)
ESP_LOGE(TAG,"IncomingFrameSWCan: Unexpected data! Id %08x: %02x %02x %02x %02x %02x %02x %02x %02x",
p_frame->MsgID, d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7] );
}
// Take care of handling state changes and event signaling.
void OvmsVehicleBoltEV::PreheatModeChange( uint8_t preheat_status )
{
CAN_frame_t txframe;
m_preheat_modechange_timer = 0;
ESP_LOGW(TAG,"---- PreheatModeChange: %s -> %s ----",
PreheatStatus(), va_preheat_status_strings[preheat_status]);
switch (preheat_status) {
case VA_PREHEAT_RELINQUISH: { // used only when preheating is started via key fob while BCM overriding is on-going
CommandLights(VA_PREHEAT_LIGHTS_ACTIVE,false);
m_preheat_commander=Fob;
} // intentional fall-thru
case VA_PREHEAT_STARTING: {
// Reset timer only if it's actually starting the first time (not cycled between started -> starting -> started)
if (mt_preheat_status->AsInt() == VA_PREHEAT_STOPPED)
mt_preheat_timer->SetValue(0);
mt_preheat_status->SetValue(VA_PREHEAT_STARTING);
MyEvents.SignalEvent("vehicle.preheat.starting",NULL);
} // ... intentional fall-thru
case VA_PREHEAT_SWITCH_ON: { // used only for overriding BCM
if (m_preheat_commander == Onstar) {
ESP_LOGI(TAG,"Turning preheating on via Onstar emulation");
SEND_EXT_FRAME(p_swcan, txframe, 0x1024E097, 3, 0x80,0x01,0xff)
vTaskDelay(360 / portTICK_PERIOD_MS);
SEND_EXT_FRAME(p_swcan, txframe, 0x1024E097, 3, 0x00,0x00,0xff)
} else if (m_preheat_commander == OVMS) {
ESP_LOGI(TAG,"Turn on preheat via overriding BCM");
//m_preheat_BCM_overridden = true;
//SEND_EXT_FRAME(p_swcan, txframe, 0x10390040, 1, 0x02)
//vTaskDelay(720 / portTICK_PERIOD_MS);
SEND_EXT_FRAME(p_swcan, txframe, 0x10390040, 1, 0x03)
}
break;
}
case VA_PREHEAT_STARTED: {
ESP_LOGI(TAG,"PreheatModeChange: Preheat started");
mt_preheat_status->SetValue(VA_PREHEAT_STARTED);
StandardMetrics.ms_v_env_hvac->SetValue(true);
MyEvents.SignalEvent("vehicle.preheat.started",NULL);
if (m_preheat_commander == OVMS) {
// When overriding BCM, controlling lights is needed since BCM does not do it for us
CommandLights(VA_PREHEAT_LIGHTS_ACTIVE,true);
}
break;
}
case VA_PREHEAT_STOPPING: {
MyEvents.SignalEvent("vehicle.preheat.stopping",NULL);
mt_preheat_status->SetValue(VA_PREHEAT_STOPPING);
if (m_preheat_commander == Onstar) {
ESP_LOGI(TAG,"Turning preheating off via Onstar emulation");
SEND_EXT_FRAME(p_swcan, txframe, 0x1024E097, 3, 0x40,0x01,0xff)
vTaskDelay(360 / portTICK_PERIOD_MS);
SEND_EXT_FRAME(p_swcan, txframe, 0x1024E097, 3, 0x00,0x00,0xff)
} else if (m_preheat_commander == OVMS) {
ESP_LOGI(TAG,"Turn off preheat via overriding BCM");
SEND_EXT_FRAME(p_swcan, txframe, 0x10390040, 1, 0x00)
}
break;
}
case VA_PREHEAT_STOPPED: {
ESP_LOGI(TAG,"PreheatModeChange: Preheat stopped");
mt_preheat_status->SetValue(VA_PREHEAT_STOPPED);
StandardMetrics.ms_v_env_hvac->SetValue(false);
MyEvents.SignalEvent("vehicle.preheat.stopped",NULL);
mt_preheat_timer->SetValue(0);
if (m_preheat_commander == OVMS) {
// When overriding BCM, controlling lights is needed since BCM does not do it for us
CommandLights(VA_PREHEAT_LIGHTS_ACTIVE,false);
}
m_preheat_commander = Disabled;
break;
}
case VA_PREHEAT_ERROR: {
MyEvents.SignalEvent("vehicle.preheat.error", NULL);
FlashLights(VA_PREHEAT_LIGHTS_ERROR,300,5);
PreheatModeChange(VA_PREHEAT_STOPPED);
break;
}
}
}
// AC status changed
void OvmsVehicleBoltEV::AirConStatusUpdated( bool ac_enabled )
{
ESP_LOGD(TAG,"AirConStatusUpdated: ac_enabled %d, preheat_status: %s", ac_enabled, PreheatStatus());
if (m_preheat_commander == Disabled)
return;
if (ac_enabled) {
if (mt_preheat_status->AsInt() == VA_PREHEAT_STARTING) {
PreheatModeChange(VA_PREHEAT_STARTED);
}
} else {
if (mt_preheat_status->AsInt() == VA_PREHEAT_STOPPING) {
PreheatModeChange(VA_PREHEAT_STOPPED);
} else if (mt_preheat_status->AsInt() == VA_PREHEAT_STARTED) {
if ( (m_preheat_commander == OVMS) && (m_preheat_modechange_timer < BCM_OVERRIDE_RELAUNCH_PERIOD)) {
ESP_LOGW(TAG,"AirConStatusUpdated: BCM managed to turn AC off despite our counter-attack. Relaunching..");
PreheatModeChange(VA_PREHEAT_STARTING);
} else {
ESP_LOGW(TAG,"AirConStatusUpdated: Preheat stopped prematurily!");
PreheatModeChange(VA_PREHEAT_ERROR);
}
}
}
}
void OvmsVehicleBoltEV::PreheatWatchdog()
{
if (mt_preheat_status->AsInt() == VA_PREHEAT_STARTED) {
mt_preheat_timer->SetValue(mt_preheat_timer->AsInt()+1);
}
m_preheat_modechange_timer++;
switch (mt_preheat_status->AsInt()) {
case VA_PREHEAT_STARTING: {
if (m_preheat_modechange_timer > VA_PREHEAT_TIMEOUT) {
// For some reason preheating did not (re)start..
m_preheat_retry_counter++;
if (m_preheat_retry_counter < VA_PREHEAT_MAX_RETRIES) {
ESP_LOGW(TAG,"Preheat did not start! Retrying..");
MyEvents.SignalEvent("vehicle.preheat.start_retry", NULL);
CommandWakeup();
vTaskDelay(720 / portTICK_PERIOD_MS);
PreheatModeChange(VA_PREHEAT_STARTING);
} else {
ESP_LOGE(TAG,"Preheat did not start!");
PreheatModeChange(VA_PREHEAT_ERROR);
}
}
break;
}
case VA_PREHEAT_STARTED: {
if (m_preheat_commander==OVMS) {
unsigned int max_time = MyConfig.GetParamValueInt("xcb", "preheat.max_time", VA_PREHEAT_MAX_TIME_DEFAULT);
if (mt_preheat_timer->AsInt() > 60 * max_time) {
ESP_LOGW(TAG,"Maximum preheat time reached. Stopping..");
PreheatModeChange(VA_PREHEAT_STOPPING);
}
}
break;
}
case VA_PREHEAT_STOPPING: {
if (m_preheat_modechange_timer > VA_PREHEAT_TIMEOUT) {
if (mt_ac_front_blower_fan_speed->IsStale()) {
// AC actually did stop, but we did not receive the last fan_speed=0 message. Assume AC is off
ESP_LOGW(TAG,"AC status went stale... Assume AC is off");
PreheatModeChange(VA_PREHEAT_STOPPED);
} else {
if (m_preheat_commander==OVMS) {
ESP_LOGE(TAG,"Preheat did not stop! Retrying..");
MyEvents.SignalEvent("vehicle.preheat.error", NULL);
PreheatModeChange(VA_PREHEAT_STOPPING);
}
}
}
break;
}
default:
break;
}
}
OvmsVehicle::vehicle_command_t OvmsVehicleBoltEV::CommandClimateControl(bool enable)
{
#ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
ESP_LOGW(TAG,"<------ REMOTE CLIMATE CONTROL: %d (Preheat Status: %s) ------>", enable, PreheatStatus() );
if ( ((mt_preheat_status->AsInt()!=VA_PREHEAT_STARTED) && (enable)) ||
((mt_preheat_status->AsInt()!=VA_PREHEAT_STOPPED) && (!enable) ) ) {
if (enable) {
CommandWakeup();
vTaskDelay(720 / portTICK_PERIOD_MS);
}
if (MyConfig.GetParamValueBool("xcb", "preheat.override_bcm", false)) {
FlashLights(VA_PREHEAT_LIGHTS_STARTSTOP);
m_preheat_commander = OVMS;
} else
m_preheat_commander = Onstar;
m_preheat_retry_counter = 0;
PreheatModeChange(enable ? VA_PREHEAT_STARTING : VA_PREHEAT_STOPPING );
} else {
ESP_LOGE(TAG,"Preheat already %s!", enable ? "active" : "inactive");
return Fail;
}
return Success;
#else
return NotImplemented;
#endif // #ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
}

View File

@ -1,42 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 14th December 2021
;
; Changes:
; 1.0 Initial release
;
; (C) 2021 Alexander Kiiyashko
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "vehicle_boltev.h"
#include "ovms_notify.h"
void OvmsVehicleBoltEV::NotifyFuel()
{
if(m_notify_metrics) {
MyNotify.NotifyStringf("data", "xcb.stat.fuel", "XCB-ENG-FuelStatus,1,86400,%d", mt_fuel_level->AsInt());
}
}
void OvmsVehicleBoltEV::NotifyMetrics()
{
NotifyFuel();
}

View File

@ -1,157 +0,0 @@
/**
* Project: Open Vehicle Monitor System
* Module: Bolt EV Webserver
*
* (c) 2019 Marko Juhanne
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <sdkconfig.h>
#ifdef CONFIG_OVMS_COMP_WEBSERVER
// #include "ovms_log.h"
// static const char *TAG = "v-boltev";
#include <stdio.h>
#include <string>
#include "ovms_metrics.h"
#include "ovms_events.h"
#include "ovms_config.h"
#include "ovms_command.h"
#include "metrics_standard.h"
#include "ovms_notify.h"
#include "ovms_webserver.h"
#include "vehicle_boltev.h"
using namespace std;
#define _attr(text) (c.encode_html(text).c_str())
#define _html(text) (c.encode_html(text).c_str())
/**
* WebInit: register pages
*/
void OvmsVehicleBoltEV::WebInit()
{
// vehicle menu:
MyWebServer.RegisterPage("/xcb/features", "Features", WebCfgFeatures, PageMenu_Vehicle, PageAuth_Cookie);
// TODO: Battery monitoring
//MyWebServer.RegisterPage("/xcb/battmon", "Battery Monitor", OvmsWebServer::HandleBmsCellMonitor, PageMenu_Vehicle, PageAuth_Cookie);
}
void OvmsVehicleBoltEV::WebCleanup()
{
MyWebServer.DeregisterPage("/xcb/features");
// TODO: Battery monitoring
//MyWebServer.DeregisterPage("/xcb/battmon");
}
/**
* WebCfgFeatures: configure general parameters (URL /xcb/config)
*/
void OvmsVehicleBoltEV::WebCfgFeatures(PageEntry_t& p, PageContext_t& c)
{
std::string error;
bool preheat_override_BCM;
bool extended_wakeup;
std::string preheat_max_time;
if (c.method == "POST") {
// process form submission:
preheat_override_BCM = (c.getvar("preheat_override_BCM") == "yes");
preheat_max_time = c.getvar("preheat_max_time");
extended_wakeup = (c.getvar("extended_wakeup") == "yes");
// check values
if (!preheat_max_time.empty()) {
int n = atoi(preheat_max_time.c_str());
if (n < 1 || n > 30)
error += "<li data-input=\"preheat_max_time\">Preheat maximum time out of range (1…30) mins</li>";
}
if (error == "") {
// store:
MyConfig.SetParamValueBool("xcb", "preheat.override_bcm", preheat_override_BCM);
MyConfig.SetParamValue("xcb", "preheat.max_time", preheat_max_time);
MyConfig.SetParamValueBool("xcb", "extended_wakeup", extended_wakeup);
c.head(200);
c.alert("success", "<p class=\"lead\">Bolt EV feature configuration saved.</p>");
MyWebServer.OutputHome(p, c);
c.done();
return;
}
// output error, return to form:
error = "<p class=\"lead\">Error!</p><ul class=\"errorlist\">" + error + "</ul>";
c.head(400);
c.alert("danger", error.c_str());
} else {
// read configuration:
preheat_override_BCM = MyConfig.GetParamValueBool("xcb", "preheat.override_bcm", false);
preheat_max_time = MyConfig.GetParamValue("xcb", "preheat.max_time", STR(VA_PREHEAT_MAX_TIME_DEFAULT));
extended_wakeup = MyConfig.GetParamValueBool("xcb", "extended_wakeup", false);
c.head(200);
}
// generate form
c.panel_start("primary", "Bolt EV feature configuration");
c.form_start(p.uri);
c.fieldset_start("SWCAN");
c.print("<p>SWCAN module support: ");
#ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
c.print("enabled");
#else
c.print("disabled");
#endif
c.print("</p>");
c.input_checkbox("Enable Extended Wake Up sequence", "extended_wakeup", extended_wakeup,
"<p>Waking up only the Body Control Module and HVAC module should be enough for our purposes. If for some reason the Remote Start / Preheating "
"or other Onstar functions do not work, please enable the Extended Wakeup feature which wakes up all the known modules and mimics better the wakeup sequence "
"that the MyVoltStar application uses. However there's a longer lag (few seconds) before actions take place. </p>");
c.fieldset_end();
c.fieldset_start("HVAC / Preheating / Remote Start");
c.input_checkbox("Enable BCM overriding when invoking Remote Start", "preheat_override_BCM", preheat_override_BCM,
"<p>Normally Remote start is invoked via key fob or by sending CAN messages that mimic those sent by Onstar module. However this does not "
"seem to work on certain models (2014 Ampera). By enabling this option the OVMS takes control of the preheating/precooling "
"and overrides the BCM by sending Remote Start CAN messages. Allows us also to set the maximum preheating time to longer than 20 minutes.</p>"
"<p>Warning! Currently does not enable the 14V Auxiliary Module, so using this option may cause charge depletion of the 12V battery unless "
"charging cable is connected!</p>"
);
c.input("number", "Maximum preheating/precooling time", "preheat_max_time", preheat_max_time.c_str(), "Default: 20 minutes",
"<p>Maximum preheating time allowed. Note! This only applies when BCM overriding is enabled.</p>",
"min=\"1\" step=\"1\" max=\"30\"", "minutes");
c.fieldset_end();
c.print("<hr>");
c.input_button("default", "Save");
c.form_end();
c.panel_end();
c.done();
}
#endif //CONFIG_OVMS_COMP_WEBSERVER

File diff suppressed because it is too large Load Diff

View File

@ -1,167 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 14th March 2017
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
; (C) 2022 Alexander von Gluck IV
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#ifndef __VEHICLE_BOLTEV_H__
#define __VEHICLE_BOLTEV_H__
#include "vehicle.h"
using namespace std;
#ifdef CONFIG_OVMS_COMP_WEBSERVER
#include "ovms_webserver.h"
#endif
#ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
#include "swcan.h"
#endif
class OvmsVehicleBoltEV : public OvmsVehicle
{
public:
OvmsVehicleBoltEV();
~OvmsVehicleBoltEV();
public:
void Status(int verbosity, OvmsWriter* writer);
void ConfigChanged(OvmsConfigParam* param);
typedef enum {
Park = 1,
Left_rear_signal = 2,
Right_rear_signal = 4,
Driver_front_signal = 8,
Passenger_front_signal = 16,
Center_stop_lamp = 32,
Charging_indicator = 64,
Interior_lamp = 128
} va_light_t;
typedef enum {
Disabled, // preheat disabled
Fob, // preheat is activated via key fob and BCM controls it. OVMS just follows the procedure passively
Onstar, // Onstar emulation. OVMS sends the Start/Stop commands but BCM controls the actual preheating
OVMS // OVMS takes care of everything (starting, stopping, lights)
} va_preheat_commander_t;
vehicle_command_t CommandWakeup();
vehicle_command_t CommandClimateControl(bool enable);
vehicle_command_t CommandLock(const char* pin);
vehicle_command_t CommandUnlock(const char* pin);
vehicle_command_t CommandHomelink(int button, int durationms=1000);
vehicle_command_t CommandLights(va_light_t lights, bool turn_on);
vehicle_command_t CommandSetChargeCurrent(uint16_t limit);
void FlashLights(va_light_t light, int interval=500, int count=1); // milliseconds
protected:
void IncomingFrameCan1(CAN_frame_t* p_frame);
void IncomingFrameCan2(CAN_frame_t* p_frame);
void IncomingFrameCan3(CAN_frame_t* p_frame);
void IncomingFrameCan4(CAN_frame_t* p_frame);
void IncomingPollReply(canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain);
void TxCallback(const CAN_frame_t* p_frame, bool success);
void CommandWakeupComplete(const CAN_frame_t* p_frame, bool success);
void SendTesterPresentMessage( uint32_t id );
virtual void Ticker1(uint32_t ticker);
virtual void Ticker10(uint32_t ticker);
virtual void Ticker300(uint32_t ticker);
virtual void NotifiedVehicleOn();
virtual void NotifiedVehicleOff();
virtual void NotifiedVehicleAwake();
// va_ac_preheat
void ClimateControlInit();
void ClimateControlPrintStatus(int verbosity, OvmsWriter* writer);
void ClimateControlIncomingSWCAN(CAN_frame_t* p_frame);
void AirConStatusUpdated( bool ac_enabled );
const char * PreheatStatus();
void PreheatModeChange( uint8_t preheat_status );
void PreheatWatchdog();
//va_notify
void NotifyFuel();
void NotifyMetrics();
protected:
char m_vin[18];
char m_type[6];
int m_modelyear;
unsigned int m_charge_timer;
unsigned int m_charge_wm;
unsigned int m_candata_timer;
unsigned int m_range_rated_km;
unsigned int m_startPolling_timer;
poll_pid_t * m_pPollingList;
canbus* p_swcan; // Either "can4" or "can3" bus, depending on which is connected to slow speed GMLAN bus
#ifdef CONFIG_OVMS_COMP_EXTERNAL_SWCAN
swcan* p_swcan_if; // Actual SWCAN interface with facilities to switch between normal and HVWUP modes
#endif
CanFrameCallback wakeup_frame_sent;
unsigned int m_tx_retry_counter;
// Bitwise status of the lights that we control. Used for establishing if sending periodic Tester Present messages is required
uint32_t m_controlled_lights;
uint32_t m_tester_present_timer;
bool m_extended_wakeup;
bool m_notify_metrics;
OvmsMetricInt * mt_preheat_status;
OvmsMetricInt * mt_preheat_timer;
OvmsMetricBool * mt_ac_active;
OvmsMetricInt * mt_ac_front_blower_fan_speed; // %
OvmsMetricFloat * mt_coolant_heater_pwr; // kW
OvmsMetricInt * mt_coolant_temp;
OvmsMetricVector<int> * mt_charging_limits;
OvmsMetricInt * mt_fuel_level; // %
OvmsMetricFloat * mt_v_trip_ev; // km
unsigned long m_preheat_modechange_timer;
va_preheat_commander_t m_preheat_commander;
unsigned int m_preheat_retry_counter;
#ifdef CONFIG_OVMS_COMP_WEBSERVER
// --------------------------------------------------------------------------
// Webserver subsystem
// - implementation: va_web.(h,cpp)
//
public:
void WebInit();
void WebCleanup();
static void WebCfgFeatures(PageEntry_t& p, PageContext_t& c);
#endif //CONFIG_OVMS_COMP_WEBSERVER
};
#endif //#ifndef __VEHICLE_VOLTAMPERA_H__

View File

@ -1,14 +0,0 @@
#
# Main component makefile.
#
# This Makefile can be left empty. By default, it will take the sources in the
# src/ directory, compile them and link them into lib(subdirectory_name).a
# in the build directory. This behaviour is entirely configurable,
# please read the ESP-IDF documents if you need to do this.
#
ifdef CONFIG_OVMS_VEHICLE_CADILLAC_C2_CTS
COMPONENT_ADD_INCLUDEDIRS:=src
COMPONENT_SRCDIRS:=src
COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
endif

View File

@ -1,387 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 9th May 2020
;
; Changes:
; 1.0 Initial release
;
; (C) 2019 Michael Stegen / Stegen Electronics
; (C) 2019 Mark Webb-Johnson
; (C) 2020 Craig Leres
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "ovms_log.h"
static const char *TAG = "v-cadillacc2cts";
#define F2C(f) (((f) - 32) / 1.8)
#include <stdio.h>
#include "vehicle_cadillac_c2_cts.h"
OvmsVehicleCadillaccC2CTS* MyCadillaccC2CTS = NULL;
static const OvmsVehicle::poll_pid_t obdii_polls[] =
{
// Engine coolant temp
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x05, { 0, 30, 30 }, 0, ISOTP_STD },
// Engine RPM
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x0c, { 10, 10, 10 }, 0, ISOTP_STD },
// Speed
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x0d, { 0, 10, 10 }, 0, ISOTP_STD },
// Engine air intake temp
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x0f, { 0, 30, 30 }, 0, ISOTP_STD },
// Fuel level
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x2f, { 0, 30, 30 }, 0, ISOTP_STD },
// Ambiant temp
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x46, { 0, 30, 30 }, 0, ISOTP_STD },
// Engine oil temp
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x5c, { 0, 30, 30 }, 0, ISOTP_STD },
#ifdef notdef
// VIN
// { 0x7df, 0, VEHICLE_POLL_TYPE_OBDIIVEHICLE, 0x02, {999,999,999 } },
#endif
POLL_LIST_END
};
static volatile bool processing;
OvmsVehicleCadillaccC2CTS::OvmsVehicleCadillaccC2CTS()
{
ESP_LOGI(TAG, "Cadillac 2nd gen CTS vehicle module");
memset(m_vin, 0, sizeof(m_vin));
RegisterCanBus(1, CAN_MODE_ACTIVE, CAN_SPEED_500KBPS);
RegisterCanBus(2, CAN_MODE_ACTIVE, CAN_SPEED_33KBPS);
PollSetPidList(m_can1, obdii_polls);
PollSetState(0);
MyCadillaccC2CTS = this;
}
#ifdef notdef
StandardMetrics.ms_v_env_headlights->SetValue(?);
#endif
OvmsVehicleCadillaccC2CTS::~OvmsVehicleCadillaccC2CTS()
{
ESP_LOGI(TAG, "Shutdown Cadillac 2nd gen CTS vehicle module");
MyCadillaccC2CTS = NULL;
}
void OvmsVehicleCadillaccC2CTS::IncomingFrameCan2(CAN_frame_t* p_frame)
{
int i, len;
uint8_t *d;
processing = 1;
d = p_frame->data.u8;
len = p_frame->FIR.B.DLC;
if (len > sizeof(p_frame->data))
len = sizeof(p_frame->data);
switch (p_frame->MsgID)
{
#ifdef notdef
case 0x1004C040:
/* Maybe soc (fuel level)? */
// 2R29 1004C040 00 68 05 7b 00 bb 00 00
// 0 1 2 3 4 5 6 7
break;
#endif
#ifdef notdef
case 0x1004C040:
/* Engine RPM and run state */
bool isRunning = (dp5] != 0);
if (StandardMetrics.ms_v_env_on->AsBool() != isRunning) {
StdMetrics.ms_v_env_on->SetValue(isRunning);
ESP_LOGI(TAG, "running: \"%s\"", isRunning ? "yes" : "no");
}
StandardMetrics.ms_v_mot_rpm->SetValue((d[2] << 8) + d[3]);
break;
#endif
#ifdef notdef
case 0x12A:
/* XXX 0F9 might be a better "awake" pid */
/* ??? is d[5] pressure? */
/* XXX we can probably find a better pid for this */
if (!StandardMetrics.ms_v_env_awake->AsBool() ) {
StandardMetrics.ms_v_env_awake->SetValue(true);
ESP_LOGI(TAG, "now awake");
}
break;
#endif
case 0x10024040:
/* First 8 of vin */
if (m_vin[0] == '\0') {
i = len;
if (i > 8)
i = 8;
/* The World Manufacturer number: United States */
m_vin[0] = '1';
memcpy(m_vin + 1, d, i);
if (m_vin[1 + 8] != '\0')
StandardMetrics.ms_v_vin->SetValue(m_vin);
}
break;
case 0x10026040:
/* Last 8 of vin */
if (m_vin[1 + 8] == '\0') {
i = len;
if (i > 8)
i = 8;
memcpy(m_vin + 1 + 8, d, i);
if (m_vin[0] != '\0')
StandardMetrics.ms_v_vin->SetValue(m_vin);
}
break;
#ifdef notdef
case 0x0C9:
/* Throttle percentage */
StandardMetrics.ms_v_env_throttle->SetValue(d[1]);
break;
#endif
#ifdef notdef
case 0x0f1:
/* ??? d[1] brake 0-100% (0-254) */
StandardMetrics.ms_v_env_footbrake->SetValue(d[2]);
#ifdef notdef
StandardMetrics.ms_v_env_handbrake->SetValue(?);
#endif
break;
#endif
#ifdef notdef
case 0x120:
/* ??? Might be locks (vehicle_kiasoulev) */
break;
#endif
#ifdef notdef
case 0x1f5:
// ??? d[3] is transmission gear: ?? might only know R, N and other
// 1=park, 2=reverse, F=neutral, ?=drive, ?=low ??
// 0x20 is probably reverse
// Gear/direction; negative=reverse, 0=neutral [1]
StandardMetrics.ms_v_env_gear->SetValue(?);
break;
#endif
#ifdef notdef
case 0x771:
/* ??? Might be open/lock doors (vehicle_kiasoulev) */
StandardMetrics.ms_v_door_fl->SetValue(?);
StandardMetrics.ms_v_door_fr->SetValue(?);
StandardMetrics.ms_v_door_rl->SetValue(?);
StandardMetrics.ms_v_door_rr->SetValue(?);
StandardMetrics.ms_v_door_hood->SetValue(?);
StandardMetrics.ms_v_door_trunk->SetValue(?);
break;
#endif
case 0x4c1:
/* ??? Ambient temperature (probably wrong) */
/* ??? probably pressure (psi) of some kind */
#ifdef notdef
StandardMetrics.ms_v_env_temp->SetValue(F2C(d[4] - 0x28));
// Cabin temperature
StandardMetrics.ms_v_env_cabintemp->SetValue(F2C(?));
#endif
break;
#ifdef notdef
case 0x???:
/* ??? Speed */
StandardMetrics.ms_v_pos_speed->SetValue(?);
#endif
#ifdef notdef
case 0x???:
/* ??? Odometer */
StandardMetrics.ms_v_pos_odometer->SetValue(?);
#endif
#ifdef notdef
case 0x???:
/* ??? TMPS */
break;
#endif
default:
break;
}
processing = 0;
}
void
OvmsVehicleCadillaccC2CTS::IncomingPollReply(canbus* bus, uint16_t type,
uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain)
{
int value1 = (int)data[0];
int value2 = ((int)data[0] << 8) + (int)data[1];
switch (pid)
{
#ifdef notdef
case 0x02: // VIN (multi-line response)
strncat(m_vin,(char*)data,length);
if (mlremain==0)
{
StandardMetrics.ms_v_vin->SetValue(m_vin);
m_vin[0] = 0;
}
break;
#endif
case 0x05: // Engine coolant temperature
StandardMetrics.ms_v_bat_temp->SetValue(value1 - 0x28);
break;
case 0x0f: // Engine intake air temperature
StandardMetrics.ms_v_inv_temp->SetValue(value1 - 0x28);
break;
case 0x5c: // Engine oil temperature
StandardMetrics.ms_v_mot_temp->SetValue(value1 - 0x28);
break;
case 0x46: // Ambient temperature
StandardMetrics.ms_v_env_temp->SetValue(value1 - 0x28);
break;
case 0x0d: // Speed
StandardMetrics.ms_v_pos_speed->SetValue(value1);
break;
case 0x2f: // Fuel Level
StandardMetrics.ms_v_bat_soc->SetValue((value1 * 100) >> 8);
break;
case 0x0c: // Engine RPM
if (value2 == 0)
{ // Car engine is OFF
PollSetState(0);
StandardMetrics.ms_v_env_handbrake->SetValue(true);
StandardMetrics.ms_v_env_on->SetValue(false);
StandardMetrics.ms_v_pos_speed->SetValue(0);
StandardMetrics.ms_v_env_charging12v->SetValue(false);
}
else
{ // Car engine is ON
PollSetState(1);
StandardMetrics.ms_v_env_handbrake->SetValue(false);
StandardMetrics.ms_v_env_on->SetValue(true);
StandardMetrics.ms_v_env_charging12v->SetValue(true);
}
break;
}
}
class OvmsVehicleCadillaccC2CTSInit
{
public: OvmsVehicleCadillaccC2CTSInit();
} MyOvmsVehicleCadillaccC2CTSInit __attribute__ ((init_priority (9000)));
OvmsVehicleCadillaccC2CTSInit::OvmsVehicleCadillaccC2CTSInit()
{
ESP_LOGI(TAG, "Registering Vehicle: Cadillac 2nd gen CTS (9000)");
MyVehicleFactory.RegisterVehicle<OvmsVehicleCadillaccC2CTS>("C2CTS",
"Cadillac 2nd gen CTS");
if (!StandardMetrics.ms_v_env_on->AsBool())
StandardMetrics.ms_v_env_on->SetValue(false);
}
// XXX from vehicle_nissanleaf.cpp
/**
* Ticker10: Called every ten seconds
*/
void OvmsVehicleCadillaccC2CTS::Ticker10(uint32_t ticker)
{
// FIXME
// detecting that on is stale and therefor should turn off probably shouldn't
// be done like this
// perhaps there should be a car on-off state tracker and event generator in
// the core framework?
// perhaps interested code should be able to subscribe to "onChange" and
// "onStale" events for each metric?
/* Skip if we're processing a can frame */
if (!processing && StandardMetrics.ms_v_env_awake->AsBool() &&
StandardMetrics.ms_v_env_awake->IsStale())
{
StandardMetrics.ms_v_env_awake->SetValue(false);
ESP_LOGI(TAG, "now asleep");
}
}
OvmsVehicle::vehicle_command_t OvmsVehicleCadillaccC2CTS::CommandWakeup()
{
CAN_frame_t frame;
memset(&frame,0,sizeof(frame));
frame.origin = m_can2;
frame.FIR.U = 0;
frame.FIR.B.DLC = 1;
frame.FIR.B.FF = CAN_frame_std;
frame.MsgID = 0x102;
frame.data.u8[0] = 0x0a;
m_can2->Write(&frame);
#ifdef notdef
// XXX roadster version
frame.origin = m_can2;
frame.FIR.U = 0;
frame.FIR.B.DLC = 8;
frame.FIR.B.FF = CAN_frame_std;
frame.MsgID = 0x102;
frame.data.u8[0] = 0x06;
frame.data.u8[1] = 0x2c;
frame.data.u8[2] = 0x01;
frame.data.u8[3] = 0x00;
frame.data.u8[4] = 0x00;
frame.data.u8[5] = 0x09;
frame.data.u8[6] = 0x10;
frame.data.u8[7] = 0x00;
m_can2->Write(&frame);
#endif
return Success;
}
OvmsVehicle::vehicle_command_t
OvmsVehicleCadillaccC2CTS::CommandLock(const char* pin)
{
return NotImplemented;
}
OvmsVehicle::vehicle_command_t
OvmsVehicleCadillaccC2CTS::CommandUnlock(const char* pin)
{
return NotImplemented;
}

View File

@ -1,63 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 9th May 2020
;
; Changes:
; 1.0 Initial release
;
; (C) 2019 Michael Stegen / Stegen Electronics
; (C) 2019 Mark Webb-Johnson
; (C) 2020 Craig Leres
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#ifndef __VEHICLE_CADILLAC_C2_CTS_H__
#define __VEHICLE_CADILLAC_C2_CTS_H__
#include "vehicle.h"
using namespace std;
class OvmsVehicleCadillaccC2CTS : public OvmsVehicle
{
public:
OvmsVehicleCadillaccC2CTS();
~OvmsVehicleCadillaccC2CTS();
protected:
void IncomingPollReply(canbus* bus, uint16_t type, uint16_t pid,
uint8_t* data, uint8_t length, uint16_t mlremain);
public:
void IncomingFrameCan2(CAN_frame_t* p_frame);
public:
virtual vehicle_command_t CommandWakeup(void);
virtual vehicle_command_t CommandLock(const char* pin);
virtual vehicle_command_t CommandUnlock(const char* pin);
private:
void Ticker10(uint32_t ticker);
protected:
char m_vin[18];
};
#endif //#ifndef __VEHICLE_CADILLAC_C2_CTS_H__

View File

@ -1,14 +0,0 @@
#
# Main component makefile.
#
# This Makefile can be left empty. By default, it will take the sources in the
# src/ directory, compile them and link them into lib(subdirectory_name).a
# in the build directory. This behaviour is entirely configurable,
# please read the ESP-IDF documents if you need to do this.
#
ifdef CONFIG_OVMS_VEHICLE_CHEVROLET_C6_CORVETTE
COMPONENT_ADD_INCLUDEDIRS:=src
COMPONENT_SRCDIRS:=src
COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
endif

View File

@ -1,154 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 9th May 2020
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
; (C) 2020 Craig Leres
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "ovms_log.h"
static const char *TAG = "v-chevroletc6corvette";
#include <stdio.h>
#include "vehicle_chevrolet_c6_corvette.h"
static const OvmsVehicle::poll_pid_t obdii_polls[] =
{
// Engine coolant temp
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x05, { 0, 30, 30 }, 0, ISOTP_STD },
// Engine RPM
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x0c, { 10, 10, 10 }, 0, ISOTP_STD },
// Speed
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x0d, { 0, 10, 10 }, 0, ISOTP_STD },
// Engine air intake temp
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x0f, { 0, 30, 30 }, 0, ISOTP_STD },
// Fuel level
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x2f, { 0, 30, 30 }, 0, ISOTP_STD },
// Ambiant temp
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x46, { 0, 30, 30 }, 0, ISOTP_STD },
// Engine oil temp
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIICURRENT, 0x5c, { 0, 30, 30 }, 0, ISOTP_STD },
// VIN
{ 0x7df, 0, VEHICLE_POLL_TYPE_OBDIIVEHICLE, 0x02, {999,999,999 }, 0, ISOTP_STD },
POLL_LIST_END
};
OvmsVehicleChevroletC6Corvette::OvmsVehicleChevroletC6Corvette()
{
ESP_LOGI(TAG, "Chevrolet C6 Corvette vehicle module");
memset(m_vin,0,sizeof(m_vin));
RegisterCanBus(1,CAN_MODE_ACTIVE,CAN_SPEED_500KBPS);
PollSetPidList(m_can1, obdii_polls);
PollSetState(0);
}
OvmsVehicleChevroletC6Corvette::~OvmsVehicleChevroletC6Corvette()
{
ESP_LOGI(TAG, "Shutdown Chevrolet C6 Corvette vehicle module");
}
void OvmsVehicleChevroletC6Corvette::IncomingPollReply(canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain)
{
int value1 = (int)data[0];
int value2 = ((int)data[0] << 8) + (int)data[1];
switch (pid)
{
case 0x02: // VIN (multi-line response)
// Data in the first frame starts with 0x01 for some (all?) vehicles
if (length > 1 && data[0] == 0x01)
{
++data;
--length;
}
strncat(m_vin,(char*)data,length);
if (mlremain==0)
{
StandardMetrics.ms_v_vin->SetValue(m_vin);
m_vin[0] = 0;
}
break;
case 0x05: // Engine coolant temperature
StandardMetrics.ms_v_bat_temp->SetValue(value1 - 0x28);
break;
case 0x0f: // Engine intake air temperature
StandardMetrics.ms_v_inv_temp->SetValue(value1 - 0x28);
break;
case 0x5c: // Engine oil temperature
StandardMetrics.ms_v_mot_temp->SetValue(value1 - 0x28);
break;
case 0x46: // Ambient temperature
StandardMetrics.ms_v_env_temp->SetValue(value1 - 0x28);
break;
case 0x0d: // Speed
StandardMetrics.ms_v_pos_speed->SetValue(value1);
break;
case 0x2f: // Fuel Level
StandardMetrics.ms_v_bat_soc->SetValue((value1 * 100) >> 8);
break;
case 0x0c: // Engine RPM
if (value2 == 0)
{ // Car engine is OFF
PollSetState(0);
StandardMetrics.ms_v_env_handbrake->SetValue(true);
StandardMetrics.ms_v_env_on->SetValue(false);
StandardMetrics.ms_v_pos_speed->SetValue(0);
StandardMetrics.ms_v_env_charging12v->SetValue(false);
}
else
{ // Car engine is ON
PollSetState(1);
StandardMetrics.ms_v_env_handbrake->SetValue(false);
StandardMetrics.ms_v_env_on->SetValue(true);
StandardMetrics.ms_v_env_charging12v->SetValue(true);
}
break;
}
}
class OvmsVehicleChevroletC6CorvetteInit
{
public: OvmsVehicleChevroletC6CorvetteInit();
} MyOvmsVehicleChevroletC6CorvetteInit __attribute__ ((init_priority (9000)));
OvmsVehicleChevroletC6CorvetteInit::OvmsVehicleChevroletC6CorvetteInit()
{
ESP_LOGI(TAG, "Registering Vehicle: Chevrolet C6 Corvette (9000)");
MyVehicleFactory.RegisterVehicle<OvmsVehicleChevroletC6Corvette>("C6CORVETTE",
"Chevrolet C6 Corvette");
if (!StandardMetrics.ms_v_env_on->AsBool())
StandardMetrics.ms_v_env_on->SetValue(false);
}

View File

@ -1,52 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 9th May 2020
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
; (C) 2020 Craig Leres
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#ifndef __VEHICLE_CHEVROLET_C6_CORVETTE_H__
#define __VEHICLE_CHEVROLET_C6_CORVETTE_H__
#include "vehicle.h"
using namespace std;
class OvmsVehicleChevroletC6Corvette : public OvmsVehicle
{
public:
OvmsVehicleChevroletC6Corvette();
~OvmsVehicleChevroletC6Corvette();
protected:
void IncomingPollReply(canbus* bus, uint16_t type, uint16_t pid, uint8_t* data, uint8_t length, uint16_t mlremain);
protected:
char m_vin[18];
};
#endif //#ifndef __VEHICLE_CHEVROLET_C6_CORVETTE_H__

View File

@ -1,12 +0,0 @@
#
# Main component makefile.
#
# This Makefile can be left empty. By default, it will take the sources in the
# src/ directory, compile them and link them into lib(subdirectory_name).a
# in the build directory. This behaviour is entirely configurable,
# please read the ESP-IDF documents if you need to do this.
#
COMPONENT_ADD_INCLUDEDIRS:=src
COMPONENT_SRCDIRS:=src
COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive

View File

@ -1,192 +0,0 @@
================
DBC Introduction
================
DBC is a CAN data description file format introduced by `Vector Informatik GmbH <https://www.vector.com/>`_.
DBC files are text files so can be created and edited using a simple text editor like the one built into
the OVMS web UI.
DBC files can be used to support vehicles that don't have a dedicated native adaption yet. This is done
using the generic DBC vehicle type, which can use DBC files to translate CAN data into metrics.
This section tries to show you how to create and use a DBC specification on the OVMS. Of course
you'll need to know how to decode your vehicle's CAN frames first. You can use the OVMS RE (reverse
engineering) toolkit to identify which messages are on the bus and which changes correlate to
actions and status on the car.
There's also a very good general introduction to DBC from CSS Electronics including an explanatory video:
https://www.csselectronics.com/screen/page/can-dbc-file-database-intro/language/en
DBC files only specify the passive (reading) part, they don't provide a means to define transmissions.
If you need to send frames to request certain information, you can still use the OVMS DBC engine to
decode the results (instead of doing the decoding in C++ code). So a DBC file can be used as a base
for a real vehicle module. To request OBD2 data during development, you can use the ``re obdii``
commands.
-------------
Basic Example
-------------
.. warning::
The DBC support is usable, but considered to be an alpha release.
The way it works may change in the future.
This example is taken from the **Twizy**, which sends some primary BMS status data at CAN ID 0x155 (341).
Note: the Twizy module actually does not use DBC, this is just an example how you would decode this
message if using DBC.
**Message example**: ``05 96 E7 54 6D 58 00 6F``
- Byte 0: charge current limit [A], scaled by 5, no offset: ``05``**25A**
- Bytes 1+2: momentary battery current [A], big endian, lower 12 bits, scaled by -0.25, offset +500: ``_6 E7``**58.25A**
- Bytes 4+5: SOC [%], big endian, scaled by 0.0025, no offset: ``6D 58``**69.98%**
These can be translated to metrics directly:
- Charge current limit: ``v.c.climit``
- Momentary battery current: ``v.b.current``
- Battery SOC: ``v.b.soc``
---------------
Create DBC File
---------------
**Copy & paste** the following into a new editor window:
.. code-block:: none
VERSION "DBC Example 1.0"
BS_: 500000 : 0,0
BO_ 341 BMS_1: 8 Vector__XXX
SG_ v_c_climit : 7|8@0+ (5,0) [0|35] "A" Vector__XXX
SG_ v_b_current : 11|12@0+ (-0.25,500) [-500|1000] "A" Vector__XXX
SG_ v_b_soc : 39|16@0+ (0.0025,0) [0|100] "%" Vector__XXX
**What does this mean?**
- ``BS_`` defines the bus speed (500 kbit in this example) and bit timings (unused)
- ``BO_`` defines the data object, a CAN frame of length 8 with ID 341 (0x155) ("BMS_1" is just an arbitrary name)
- ``SG_`` lines define the signals (values) embedded in the object (see below)
- ``Vector__XXX`` is just a placeholder for any sender/receiver (currently unused by the OVMS)
**Signals** are defined by their…
- Name (= metric name with ``.`` replaced by ``_``)
- Start position (bit position) and bit length (``7|8``)
- Endianness: ``0`` = big endian (most significant byte first), ``1`` = little endian (least significant byte first) (Note: the DBC format documentation is wrong on this)
- Signedness: ``+`` = unsigned, ``-`` = signed
- Scaling and offset: ``(-0.25,500)`` => real value = raw value * -0.25 + 500
- Minimum/maximum: ``[-500|1000]`` = valid real values are in the range -500 to 1000
- Unit: e.g. ``"A"`` (ignored/irrelevant, defined by the metric)
The metric to set can be given as the name of the signal. You may use the metric name directly
on the OVMS, but to conform to the DBC standard, replace the dots by ``_``.
**Bit positions** are counted from byte 0 upwards by their significance, regardless of the endianness.
The first message byte has bits 0…7 with bit 7 being the most significant bit of the byte. The
second byte has bits 8…15 with bit 15 being the MSB, and so on:
.. code-block:: none
[ 7 6 5 4 3 2 1 0 ] [ 15 14 13 12 11 10 9 8 ] [ 23 22 21 20 …
`----- Byte 0 ----´ `------- Byte 1 --------´ `----- Byte 2 …
For big endian values, signal start bit positions are given for the most significant bit. For
little endian values, the start position is that of the least significant bit.
.. note::
**On endianness**: "big endian" means a byte sequence of ``0x12 0x34`` decodes into ``0x1234``
(most significant byte first), "little endian" means the same byte sequence decodes into ``0x3412``
(least significant byte first). "Big endian" is the natural way of writing numbers, i.e. with their
most significant digit coming first, "little endian" is vice versa. Endianness only applies
to values of multiple bytes, single byte values are always written naturally / "big endian".
------------
Use DBC File
------------
**Save** the DBC example as: ``/store/dbc/twizy1.dbc`` (the directory will be created by the editor)
**Open the shell**. To see debug logs, issue ``log level debug dbc-parser`` and ``log level debug v-dbc``.
Note: the DBC parser currently isn't graceful on errors, **a wrong DBC file may crash the module**.
So you should only enable automatic loading of DBC files on boot when you're done developing
and testing it.
So let's first try if the **DBC engine can parse** our file. The ``dbc autoload`` command loads all
DBC files from the ``/store/dbc`` directory:
.. code-block:: none
OVMS# dbc autoload
Auto-loading DBC files...
D (238062) dbc-parser: VERSION parsed as: DBC Example 1.0
D (238062) dbc-parser: BU_ parsed 1 nodes
D (238062) dbc-parser: BO_ parsed message 341
D (238072) dbc-parser: SG_ parsed signal v_c_climit
D (238072) dbc-parser: SG_ parsed signal v_b_current
D (238082) dbc-parser: SG_ parsed signal v_b_soc
Looks good. ``dbc list`` can tell us some statistics:
.. code-block:: none
OVMS# dbc list
twizy1: DBC Example 1.0: 1 message(s), 3 signal(s), 56% coverage, 1 lock(s)
The coverage tells us how much of our CAN data bits are covered by signal definitions.
Now let's **load the file into the DBC vehicle**:
.. code-block:: none
OVMS# config set vehicle dbc.can1 twizy1
Parameter has been set.
OVMS# vehicle module NONE
I (1459922) v-none: Generic NONE vehicle module
OVMS# vehicle module DBC
I (249022) v-dbc: Pure DBC vehicle module
I (249022) v-dbc: Registering can bus #1 as DBC twizy1
Nice. Let's **simulate receiving our test frame** and check the decoded metrics:
.. code-block:: none
OVMS# can can1 rx standard 155 05 96 E7 54 6D 58 00 6F
OVMS# me li v.b.soc
v.b.soc 69.98%
OVMS# me li v.b.current
v.b.current 58.25A
OVMS# me li v.c.climit
v.c.climit 25A
So the decoding apparently works.
**To configure DBC mode for autostart** we now just need to set the DBC vehicle mode to be
loaded on vehicle startup, and to enable autoloading of the DBC files from ``/store/dbc``. You can
do so either by using the user interface page Config → Autostart (check "Autoload DBC files" and
set the vehicle type to "DBC"), or from the shell by…
.. code-block:: none
OVMS# config set auto dbc yes
OVMS# config set auto vehicle.type DBC
Try a reboot to see if everything works.
You can now add more objects and signals to your DBC file.
.. note::
During development of a DBC file, you'll need to reload the file frequently. The DBC engine
locks the currently used vehicle, so you'll need to unload the DBC vehicle (``vehicle module NONE``),
then reload the DBC file (``dbc autoload``), then reactivate the DBC vehicle (``vehicle module DBC``).

View File

@ -1,45 +0,0 @@
==================
DBC Based Vehicles
==================
Vehicle Type: **DBC**
The DBC based vehicle reads a specified DBC file describing CAN bus messages and produces vehicle metrics from that. It is under development, experimental, and not generally available.
----------------
Support Overview
----------------
=========================== ==============
Function Support Status
=========================== ==============
Hardware This is vehicle specific. The DBC vehicle module can be configured to use any or all of the 3 CAN buses.
Vehicle Cable Vehicle specific
GSM Antenna Standard GSM antenna
GPS Antenna Vehicle specific. Standard OVMS GPS supported.
SOC Display Yes, if DBC maps it
Range Display Yes, if DBC maps it
GPS Location Yes, if DBC maps it, otherwise OVMS GPS
Speed Display Yes, if DBC maps it
Temperature Display Yes, if DBC maps it
BMS v+t Display Not currently supported
TPMS Display Yes, if DBC maps it
Charge Status Display Yes, if DBC maps it
Charge Interruption Alerts Yes, if DBC maps it
Charge Control Not supported by DBC format, maybe by extension
Cabin Pre-heat/cool Control Not supported by DBC format, maybe by extension
Lock/Unlock Vehicle Not supported by DBC format, maybe by extension
Valet Mode Control Not supported by DBC format, maybe by extension
Others None
=========================== ==============
--------
Contents
--------
.. toctree::
:maxdepth: 1
dbc-primer

View File

@ -1,171 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 14th March 2017
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "ovms_log.h"
static const char *TAG = "v-dbc";
#include "vehicle_dbc.h"
#include "dbc_app.h"
OvmsVehicleDBC::OvmsVehicleDBC()
{
}
OvmsVehicleDBC::~OvmsVehicleDBC()
{
if (m_can1) m_can1->DetachDBC();
if (m_can2) m_can2->DetachDBC();
if (m_can3) m_can3->DetachDBC();
}
bool OvmsVehicleDBC::RegisterCanBusDBC(int bus, CAN_mode_t mode, const char* name, const char* dbc)
{
dbcfile *ndbc = MyDBC.LoadString(name, dbc);
if (ndbc == NULL) return false;
OvmsVehicle::RegisterCanBus(bus, mode, (CAN_speed_t)(ndbc->m_bittiming.GetBaudRate()/1000),ndbc);
return true;
}
bool OvmsVehicleDBC::RegisterCanBusDBCLoaded(int bus, CAN_mode_t mode, const char* dbcloaded)
{
dbcfile* ndbc = MyDBC.Find(dbcloaded);
if (ndbc==NULL) return false;
OvmsVehicle::RegisterCanBus(bus, mode, (CAN_speed_t)(ndbc->m_bittiming.GetBaudRate()/1000),ndbc);
return true;
}
void OvmsVehicleDBC::IncomingFrameCan1(CAN_frame_t* p_frame)
{
// This should be called from the IncomingFrameCan1 handler of the derived vehicle class
IncomingFrame(m_can1, p_frame);
}
void OvmsVehicleDBC::IncomingFrameCan2(CAN_frame_t* p_frame)
{
// This should be called from the IncomingFrameCan1 handler of the derived vehicle class
IncomingFrame(m_can2, p_frame);
}
void OvmsVehicleDBC::IncomingFrameCan3(CAN_frame_t* p_frame)
{
// This should be called from the IncomingFrameCan1 handler of the derived vehicle class
IncomingFrame(m_can3, p_frame);
}
void OvmsVehicleDBC::IncomingFrame(canbus* bus, CAN_frame_t* frame)
{
dbcfile* dbc = bus->GetDBC();
if (dbc==NULL) return;
dbcMessage* msg = dbc->m_messages.FindMessage(frame->FIR.B.FF, frame->MsgID);
if (msg)
{
dbcSignal* mux = msg->GetMultiplexorSignal();
uint32_t muxval;
if (mux)
{
dbcNumber r = mux->Decode(frame);
muxval = r.GetSignedInteger();
}
for (dbcSignal* sig : msg->m_signals)
{
OvmsMetric* m = sig->GetMetric();
if (m)
{
if ((mux==NULL)||(sig->GetMultiplexSwitchvalue() == muxval))
{
dbcNumber r = sig->Decode(frame);
m->SetValue(r);
}
}
}
}
}
OvmsVehiclePureDBC::OvmsVehiclePureDBC()
{
ESP_LOGI(TAG, "Pure DBC vehicle module");
std::string dbctype;
dbctype = MyConfig.GetParamValue("vehicle", "dbc.can1");
if (dbctype.length()>0)
{
ESP_LOGI(TAG,"Registering can bus #1 as DBC %s",dbctype.c_str());
RegisterCanBusDBCLoaded(1, CAN_MODE_LISTEN, dbctype.c_str());
}
dbctype = MyConfig.GetParamValue("vehicle", "dbc.can2");
if (dbctype.length()>0)
{
ESP_LOGI(TAG,"Registering can bus #2 as DBC %s",dbctype.c_str());
RegisterCanBusDBCLoaded(2, CAN_MODE_LISTEN, dbctype.c_str());
}
dbctype = MyConfig.GetParamValue("vehicle", "dbc.can3");
if (dbctype.length()>0)
{
ESP_LOGI(TAG,"Registering can bus #3 as DBC %s",dbctype.c_str());
RegisterCanBusDBCLoaded(3, CAN_MODE_LISTEN, dbctype.c_str());
}
}
OvmsVehiclePureDBC::~OvmsVehiclePureDBC()
{
ESP_LOGI(TAG, "Shutdown Pure DBC vehicle module");
}
void OvmsVehiclePureDBC::IncomingFrameCan1(CAN_frame_t* p_frame)
{
OvmsVehicleDBC::IncomingFrameCan1(p_frame);
}
void OvmsVehiclePureDBC::IncomingFrameCan2(CAN_frame_t* p_frame)
{
OvmsVehicleDBC::IncomingFrameCan2(p_frame);
}
void OvmsVehiclePureDBC::IncomingFrameCan3(CAN_frame_t* p_frame)
{
OvmsVehicleDBC::IncomingFrameCan3(p_frame);
}
class OvmsVehiclePureDBCInit
{
public: OvmsVehiclePureDBCInit();
} MyOvmsVehiclePureDBCInit __attribute__ ((init_priority (9000)));
OvmsVehiclePureDBCInit::OvmsVehiclePureDBCInit()
{
ESP_LOGI(TAG, "Registering Vehicle: DBC based vehicle (9000)");
MyVehicleFactory.RegisterVehicle<OvmsVehiclePureDBC>("DBC","DBC-based Vehicle");
}

View File

@ -1,70 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 14th March 2017
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#ifndef __VEHICLE_DBC_H__
#define __VEHICLE_DBC_H__
#include "vehicle.h"
#include "dbc.h"
using namespace std;
class OvmsVehicleDBC : public OvmsVehicle
{
public:
OvmsVehicleDBC();
virtual ~OvmsVehicleDBC();
protected:
bool RegisterCanBusDBC(int bus, CAN_mode_t mode, const char* name, const char* dbc);
bool RegisterCanBusDBCLoaded(int bus, CAN_mode_t mode, const char* dbcloaded);
protected:
virtual void IncomingFrameCan1(CAN_frame_t* p_frame);
virtual void IncomingFrameCan2(CAN_frame_t* p_frame);
virtual void IncomingFrameCan3(CAN_frame_t* p_frame);
protected:
virtual void IncomingFrame(canbus* bus, CAN_frame_t* frame);
};
class OvmsVehiclePureDBC : public OvmsVehicleDBC
{
public:
OvmsVehiclePureDBC();
~OvmsVehiclePureDBC();
public:
void IncomingFrameCan1(CAN_frame_t* p_frame);
void IncomingFrameCan2(CAN_frame_t* p_frame);
void IncomingFrameCan3(CAN_frame_t* p_frame);
};
#endif //#ifndef __VEHICLE_DBC_H__

View File

@ -1,14 +0,0 @@
#
# Main component makefile.
#
# This Makefile can be left empty. By default, it will take the sources in the
# src/ directory, compile them and link them into lib(subdirectory_name).a
# in the build directory. This behaviour is entirely configurable,
# please read the ESP-IDF documents if you need to do this.
#
ifdef CONFIG_OVMS_VEHICLE_DEMO
COMPONENT_ADD_INCLUDEDIRS:=src
COMPONENT_SRCDIRS:=src
COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
endif

View File

@ -1,34 +0,0 @@
============
DEMO Vehicle
============
Vehicle Type: **DEMO**
The demonstration vehicle can be used to verify module functionality, but is mostly used for development purposes. The vehicle itself updates system metrics with simulated data. It can respond to charge, and other similar, commands.
----------------
Support Overview
----------------
=========================== ==============
Function Support Status
=========================== ==============
Hardware Demonstration data only, no vehicle connection
Vehicle Cable None, not required (other than power)
GSM Antenna Standard GSM antenna
GPS Antenna None, not required
SOC Display Yes
Range Display Yes
GPS Location Yes
Speed Display Yes
Temperature Display Yes
BMS v+t Display Not currently supported
TPMS Display Yes
Charge Status Display Yes
Charge Interruption Alerts Yes
Charge Control Yes
Cabin Pre-heat/cool Control Not currently supported
Lock/Unlock Vehicle Yes
Valet Mode Control Yes
Others None
=========================== ==============

View File

@ -1,301 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 14th March 2017
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#include "ovms_log.h"
static const char *TAG = "v-demo";
#include <stdio.h>
#include "vehicle_demo.h"
#include "metrics_standard.h"
OvmsVehicleDemo::OvmsVehicleDemo()
{
ESP_LOGI(TAG, "Demonstration vehicle module");
StandardMetrics.ms_v_type->SetValue("DEMO");
StandardMetrics.ms_v_vin->SetValue("DEMODEMODEMO");
StandardMetrics.ms_v_bat_soc->SetValue(50);
StandardMetrics.ms_v_bat_soh->SetValue(100);
StandardMetrics.ms_v_bat_cac->SetValue(160);
StandardMetrics.ms_v_bat_voltage->SetValue(400);
StandardMetrics.ms_v_bat_current->SetValue(0);
StandardMetrics.ms_v_bat_power->SetValue(0);
StandardMetrics.ms_v_bat_energy_used->SetValue(0);
StandardMetrics.ms_v_bat_energy_recd->SetValue(0);
StandardMetrics.ms_v_bat_range_full->SetValue(400);
StandardMetrics.ms_v_bat_range_ideal->SetValue(200);
StandardMetrics.ms_v_bat_range_est->SetValue(160);
StandardMetrics.ms_v_bat_12v_voltage->SetValue(12);
StandardMetrics.ms_v_bat_12v_current->SetValue(0);
StandardMetrics.ms_v_bat_temp->SetValue(25);
StandardMetrics.ms_v_charge_voltage->SetValue(0);
StandardMetrics.ms_v_charge_current->SetValue(0);
StandardMetrics.ms_v_charge_climit->SetValue(0);
StandardMetrics.ms_v_charge_kwh->SetValue(0);
StandardMetrics.ms_v_charge_mode->SetValue("standard");
StandardMetrics.ms_v_charge_timermode->SetValue(false);
StandardMetrics.ms_v_charge_timerstart->SetValue(0);
StandardMetrics.ms_v_charge_state->SetValue("done");
StandardMetrics.ms_v_charge_substate->SetValue("stopped");
StandardMetrics.ms_v_charge_type->SetValue("type2");
StandardMetrics.ms_v_charge_pilot->SetValue(false);
StandardMetrics.ms_v_charge_inprogress->SetValue(false);
StandardMetrics.ms_v_charge_limit_range->SetValue(0);
StandardMetrics.ms_v_charge_limit_soc->SetValue(0);
StandardMetrics.ms_v_charge_duration_full->SetValue(0);
StandardMetrics.ms_v_charge_duration_range->SetValue(0);
StandardMetrics.ms_v_charge_duration_soc->SetValue(0);
StandardMetrics.ms_v_charge_temp->SetValue(22);
StandardMetrics.ms_v_inv_temp->SetValue(22);
StandardMetrics.ms_v_mot_rpm->SetValue(0);
StandardMetrics.ms_v_mot_temp->SetValue(30);
StandardMetrics.ms_v_door_fl->SetValue(false);
StandardMetrics.ms_v_door_fr->SetValue(false);
StandardMetrics.ms_v_door_rl->SetValue(false);
StandardMetrics.ms_v_door_rr->SetValue(false);
StandardMetrics.ms_v_door_chargeport->SetValue(false);
StandardMetrics.ms_v_door_hood->SetValue(false);
StandardMetrics.ms_v_door_trunk->SetValue(false);
StandardMetrics.ms_v_env_drivemode->SetValue(0);
StandardMetrics.ms_v_env_handbrake->SetValue(false);
StandardMetrics.ms_v_env_awake->SetValue(false);
StandardMetrics.ms_v_env_charging12v->SetValue(false);
StandardMetrics.ms_v_env_cooling->SetValue(false);
StandardMetrics.ms_v_env_heating->SetValue(false);
StandardMetrics.ms_v_env_hvac->SetValue(false);
StandardMetrics.ms_v_env_on->SetValue(false);
StandardMetrics.ms_v_env_locked->SetValue(false);
StandardMetrics.ms_v_env_valet->SetValue(false);
StandardMetrics.ms_v_env_headlights->SetValue(false);
StandardMetrics.ms_v_env_alarm->SetValue(false);
StandardMetrics.ms_v_env_ctrl_login->SetValue(false);
StandardMetrics.ms_v_env_ctrl_config->SetValue(false);
StandardMetrics.ms_v_env_temp->SetValue(22);
StandardMetrics.ms_v_pos_gpslock->SetValue(true);
StandardMetrics.ms_v_pos_satcount->SetValue(12);
StandardMetrics.ms_v_pos_latitude->SetValue(22.280868);
StandardMetrics.ms_v_pos_longitude->SetValue(114.160598);
StandardMetrics.ms_v_pos_direction->SetValue(10);
StandardMetrics.ms_v_pos_altitude->SetValue(30);
StandardMetrics.ms_v_pos_speed->SetValue(0);
StandardMetrics.ms_v_pos_odometer->SetValue(100000);
StandardMetrics.ms_v_pos_trip->SetValue(0);
StandardMetrics.ms_v_tpms_pressure->SetValue(std::vector<float>{ 206.843, 216.483, 275.79, 175.79 });
StandardMetrics.ms_v_tpms_temp->SetValue(std::vector<float>{ 33, 33, 34, 38 });
StandardMetrics.ms_v_tpms_health->SetValue(std::vector<float>{ 95, 93, 96, 74 });
StandardMetrics.ms_v_tpms_alert->SetValue(std::vector<short>{ 0, 0, 0, 1 });
}
OvmsVehicleDemo::~OvmsVehicleDemo()
{
ESP_LOGI(TAG, "Shutdown demonstration vehicle module");
}
void OvmsVehicleDemo::Ticker1(uint32_t ticker)
{
OvmsVehicle::Ticker1(ticker);
if (StandardMetrics.ms_v_env_on->AsBool())
{
// We are driving
int speed = StandardMetrics.ms_v_pos_speed->AsInt() + (rand()%3) -1;
if (speed<0) speed = 0;
else if (speed>100) speed = 100;
StandardMetrics.ms_v_pos_speed->SetValue(speed);
StandardMetrics.ms_v_mot_rpm->SetValue(speed*112);
}
}
void OvmsVehicleDemo::Ticker10(uint32_t ticker)
{
OvmsVehicle::Ticker10(ticker);
if (StandardMetrics.ms_v_charge_inprogress->AsBool())
{
// We are charging
float soc = StandardMetrics.ms_v_bat_soc->AsFloat();
if (soc < 100)
{
soc += 0.1;
StandardMetrics.ms_v_bat_soc->SetValue(soc);
}
else
{
// Car full
StandardMetrics.ms_v_charge_inprogress->SetValue(false);
StandardMetrics.ms_v_door_chargeport->SetValue(false);
StandardMetrics.ms_v_charge_state->SetValue("done");
StandardMetrics.ms_v_charge_substate->SetValue("stopped");
StandardMetrics.ms_v_charge_pilot->SetValue(false);
StandardMetrics.ms_v_charge_voltage->SetValue(0);
StandardMetrics.ms_v_charge_current->SetValue(0);
}
}
else if (StandardMetrics.ms_v_env_on->AsBool())
{
// We are driving
float soc = StandardMetrics.ms_v_bat_soc->AsFloat();
if (soc > 0)
{
int speed = StandardMetrics.ms_v_pos_speed->AsInt() + (rand()%3) -1;
if (speed<0) speed = 0;
else if (speed>100) speed = 100;
soc -= 0.1;
StandardMetrics.ms_v_bat_soc->SetValue(soc);
StandardMetrics.ms_v_pos_speed->SetValue(speed);
StandardMetrics.ms_v_mot_rpm->SetValue(speed*112);
}
else
{
// Battery is empty. Charge the car...
StandardMetrics.ms_v_pos_speed->SetValue(0);
StandardMetrics.ms_v_mot_rpm->SetValue(0);
StandardMetrics.ms_v_env_on->SetValue(false);
StandardMetrics.ms_v_charge_inprogress->SetValue(true);
StandardMetrics.ms_v_door_chargeport->SetValue(true);
StandardMetrics.ms_v_charge_state->SetValue("charging");
StandardMetrics.ms_v_charge_substate->SetValue("onrequest");
StandardMetrics.ms_v_charge_pilot->SetValue(true);
StandardMetrics.ms_v_charge_voltage->SetValue(220);
StandardMetrics.ms_v_charge_current->SetValue(32);
}
}
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandSetChargeMode(vehicle_mode_t mode)
{
return NotImplemented;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandSetChargeCurrent(uint16_t limit)
{
StandardMetrics.ms_v_charge_climit->SetValue(limit);
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandStartCharge()
{
StandardMetrics.ms_v_pos_speed->SetValue(0);
StandardMetrics.ms_v_mot_rpm->SetValue(0);
StandardMetrics.ms_v_env_on->SetValue(false);
StandardMetrics.ms_v_charge_inprogress->SetValue(true);
StandardMetrics.ms_v_door_chargeport->SetValue(true);
StandardMetrics.ms_v_charge_state->SetValue("charging");
StandardMetrics.ms_v_charge_substate->SetValue("onrequest");
StandardMetrics.ms_v_charge_pilot->SetValue(true);
StandardMetrics.ms_v_charge_voltage->SetValue(220);
StandardMetrics.ms_v_charge_current->SetValue(32);
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandStopCharge()
{
StandardMetrics.ms_v_charge_inprogress->SetValue(false);
StandardMetrics.ms_v_door_chargeport->SetValue(false);
StandardMetrics.ms_v_charge_state->SetValue("done");
StandardMetrics.ms_v_charge_substate->SetValue("stopped");
StandardMetrics.ms_v_charge_pilot->SetValue(false);
StandardMetrics.ms_v_charge_voltage->SetValue(0);
StandardMetrics.ms_v_charge_current->SetValue(0);
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandSetChargeTimer(bool timeron, uint16_t timerstart)
{
return NotImplemented;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandCooldown(bool cooldownon)
{
return NotImplemented;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandWakeup()
{
StandardMetrics.ms_v_charge_inprogress->SetValue(false);
StandardMetrics.ms_v_door_chargeport->SetValue(false);
StandardMetrics.ms_v_charge_state->SetValue("done");
StandardMetrics.ms_v_charge_substate->SetValue("stopped");
StandardMetrics.ms_v_charge_pilot->SetValue(false);
StandardMetrics.ms_v_charge_voltage->SetValue(0);
StandardMetrics.ms_v_charge_current->SetValue(0);
StandardMetrics.ms_v_env_on->SetValue(true);
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandLock(const char* pin)
{
StandardMetrics.ms_v_env_locked->SetValue(true);
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandUnlock(const char* pin)
{
StandardMetrics.ms_v_env_locked->SetValue(false);
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandActivateValet(const char* pin)
{
StandardMetrics.ms_v_env_valet->SetValue(true);
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandDeactivateValet(const char* pin)
{
StandardMetrics.ms_v_env_valet->SetValue(false);
return Success;
}
OvmsVehicle::vehicle_command_t OvmsVehicleDemo::CommandHomelink(int button, int durationms)
{
return NotImplemented;
}
class OvmsVehicleDemoInit
{
public: OvmsVehicleDemoInit();
} MyOvmsVehicleDemoInit __attribute__ ((init_priority (9000)));
OvmsVehicleDemoInit::OvmsVehicleDemoInit()
{
ESP_LOGI(TAG, "Registering Vehicle: DEMO (9000)");
MyVehicleFactory.RegisterVehicle<OvmsVehicleDemo>("DEMO","Demonstration Vehicle");
}

View File

@ -1,63 +0,0 @@
/*
; Project: Open Vehicle Monitor System
; Date: 14th March 2017
;
; Changes:
; 1.0 Initial release
;
; (C) 2011 Michael Stegen / Stegen Electronics
; (C) 2011-2017 Mark Webb-Johnson
; (C) 2011 Sonny Chen @ EPRO/DX
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in
; all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
; THE SOFTWARE.
*/
#ifndef __VEHICLE_DEMO_H__
#define __VEHICLE_DEMO_H__
#include "vehicle.h"
using namespace std;
class OvmsVehicleDemo : public OvmsVehicle
{
public:
OvmsVehicleDemo();
~OvmsVehicleDemo();
public:
virtual void Ticker1(uint32_t ticker);
virtual void Ticker10(uint32_t ticker);
public:
virtual vehicle_command_t CommandSetChargeMode(vehicle_mode_t mode);
virtual vehicle_command_t CommandSetChargeCurrent(uint16_t limit);
virtual vehicle_command_t CommandStartCharge();
virtual vehicle_command_t CommandStopCharge();
virtual vehicle_command_t CommandSetChargeTimer(bool timeron, uint16_t timerstart);
virtual vehicle_command_t CommandCooldown(bool cooldownon);
virtual vehicle_command_t CommandWakeup();
virtual vehicle_command_t CommandLock(const char* pin);
virtual vehicle_command_t CommandUnlock(const char* pin);
virtual vehicle_command_t CommandActivateValet(const char* pin);
virtual vehicle_command_t CommandDeactivateValet(const char* pin);
virtual vehicle_command_t CommandHomelink(int button, int durationms=1000);
};
#endif //#ifndef __VEHICLE_DEMO_H__

Some files were not shown because too many files have changed in this diff Show More