Compare commits

...

6 Commits

Author SHA1 Message Date
Dean Lee 3ba8e77bd4
dbc: force C locale for numbers. (#839) 2023-05-23 22:03:19 -07:00
Aaron Logan 7e3b518d33
VW PQ: added AWV (AEB) signals (#824)
* Added AWV (AEB) signals

* AWV message length: 8

* AWV message cleanup and VAL table added

* Sort AWV

* update VAL table for AWV

More German stuff
2023-05-19 18:52:58 -07:00
Adeeb Shihadeh 98a700dce5
pre-commit: autoupdate hooks (#836)
Update pre-commit hook versions

Co-authored-by: adeebshihadeh <adeebshihadeh@users.noreply.github.com>
2023-05-16 11:49:57 -07:00
Shane Smiskol f12052306e
Nissan: correct angle signal ranges (#830)
correct signal ranges
2023-05-01 17:17:42 -07:00
Shane Smiskol 23b83b51e3
Toyota: add comment for CLUTCH->ACC_FAULTED (#829)
add comment
2023-04-24 17:29:04 -07:00
Dean Lee 8faada0494
refactor CANParser to improve performance (#795)
* reduce the const of copying signal values in CANParser::query_latest

* pass by reference

* use for range loop

* update_strings

* use assign

* track all signals

* use iterator & pointer to avoid copy SignalValue from vector

* use normal dict for vl_all

* update tests

* fix error in merge master

* change thresholds

reduce thresholds

* Trigger CI

* Trigger CI

* Trigger CI

* cleanup ctor

* reduce threshold

* revert changes to test_parser.py

* change thresholds

* remove update_string() from cython

* comment out test_performance_one_signal

* reduce thresholds

* test

* update

* update

* revert that for now

* update

* update

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-04-22 17:54:36 -07:00
16 changed files with 131 additions and 93 deletions

View File

@ -14,6 +14,10 @@ jobs:
unit-tests:
name: unit tests
runs-on: ubuntu-20.04
#strategy:
# fail-fast: false
# matrix:
# run: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
steps:
- uses: actions/checkout@v3
- name: Build Docker image

View File

@ -15,7 +15,7 @@ repos:
- --check-hidden
- --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.2.0
rev: v1.3.0
hooks:
- id: mypy
- repo: https://github.com/PyCQA/flake8

View File

@ -81,11 +81,12 @@ public:
CANParser(int abus, const std::string& dbc_name, bool ignore_checksum, bool ignore_counter);
#ifndef DYNAMIC_CAPNP
void update_string(const std::string &data, bool sendcan);
void update_strings(const std::vector<std::string> &data, std::vector<SignalValue> &vals, bool sendcan);
void UpdateCans(uint64_t sec, const capnp::List<cereal::CanData>::Reader& cans);
#endif
void UpdateCans(uint64_t sec, const capnp::DynamicStruct::Reader& cans);
void UpdateValid(uint64_t sec);
std::vector<SignalValue> query_latest();
void query_latest(std::vector<SignalValue> &vals, uint64_t last_ts = 0);
};
class CANPacker {

View File

@ -78,8 +78,7 @@ cdef extern from "common.h":
bool can_valid
bool bus_timeout
CANParser(int, string, vector[MessageParseOptions], vector[SignalParseOptions])
void update_string(string&, bool)
vector[SignalValue] query_latest()
void update_strings(vector[string]&, vector[SignalValue]&, bool)
cdef cppclass CANPacker:
CANPacker(string)

View File

@ -106,6 +106,7 @@ DBC* dbc_parse_from_stream(const std::string &dbc_name, std::istream &stream, Ch
std::map<uint32_t, std::vector<Signal>> signals;
DBC* dbc = new DBC;
dbc->name = dbc_name;
std::setlocale(LC_NUMERIC, "C");
// used to find big endian LSB from MSB and size
std::vector<int> be_bits;

View File

@ -33,7 +33,7 @@ int64_t get_raw_value(const std::vector<uint8_t> &msg, const Signal &sig) {
bool MessageState::parse(uint64_t sec, const std::vector<uint8_t> &dat) {
for (int i = 0; i < parse_sigs.size(); i++) {
auto &sig = parse_sigs[i];
const auto &sig = parse_sigs[i];
int64_t tmp = get_raw_value(dat, sig);
if (sig.is_signed) {
@ -204,14 +204,24 @@ void CANParser::update_string(const std::string &data, bool sendcan) {
UpdateValid(last_sec);
}
void CANParser::update_strings(const std::vector<std::string> &data, std::vector<SignalValue> &vals, bool sendcan) {
uint64_t current_sec = 0;
for (const auto &d : data) {
update_string(d, sendcan);
if (current_sec == 0) {
current_sec = last_sec;
}
}
query_latest(vals, current_sec);
}
void CANParser::UpdateCans(uint64_t sec, const capnp::List<cereal::CanData>::Reader& cans) {
//DEBUG("got %d messages\n", cans.size());
bool bus_empty = true;
// parse the messages
for (int i = 0; i < cans.size(); i++) {
auto cmsg = cans[i];
for (const auto cmsg : cans) {
if (cmsg.getSrc() != bus) {
// DEBUG("skip %d: wrong bus\n", cmsg.getAddress());
continue;
@ -301,16 +311,19 @@ void CANParser::UpdateValid(uint64_t sec) {
can_valid = (can_invalid_cnt < CAN_INVALID_CNT) && _counters_valid;
}
std::vector<SignalValue> CANParser::query_latest() {
std::vector<SignalValue> ret;
void CANParser::query_latest(std::vector<SignalValue> &vals, uint64_t last_ts) {
if (last_ts == 0) {
last_ts = last_sec;
}
for (auto& kv : message_states) {
auto& state = kv.second;
if (last_sec != 0 && state.last_seen_nanos != last_sec) continue;
if (last_ts != 0 && state.last_seen_nanos < last_ts) {
continue;
}
for (int i = 0; i < state.parse_sigs.size(); i++) {
const Signal &sig = state.parse_sigs[i];
SignalValue &v = ret.emplace_back();
SignalValue &v = vals.emplace_back();
v.address = state.address;
v.ts_nanos = state.last_seen_nanos;
v.name = sig.name;
@ -319,6 +332,4 @@ std::vector<SignalValue> CANParser::query_latest() {
state.all_vals[i].clear();
}
}
return ret;
}

View File

@ -1,6 +1,7 @@
# distutils: language = c++
# cython: c_string_encoding=ascii, language_level=3
from cython.operator cimport dereference as deref, preincrement as preinc
from libcpp.string cimport string
from libcpp.vector cimport vector
from libcpp.unordered_set cimport unordered_set
@ -101,45 +102,29 @@ cdef class CANParser:
message_options_v.push_back(mpo)
self.can = new cpp_CANParser(bus, dbc_name, message_options_v, signal_options_v)
self.update_vl()
cdef unordered_set[uint32_t] update_vl(self):
cdef unordered_set[uint32_t] updated_addrs
new_vals = self.can.query_latest()
for cv in new_vals:
# Cast char * directly to unicode
cv_name = <unicode>cv.name
self.vl[cv.address][cv_name] = cv.value
self.ts_nanos[cv.address][cv_name] = cv.ts_nanos
vl_all = self.vl_all[cv.address]
if (cv_name in vl_all):
vl_all[cv_name].extend(cv.all_values)
else:
vl_all[cv_name] = cv.all_values
updated_addrs.insert(cv.address)
return updated_addrs
def update_string(self, dat, sendcan=False):
for v in self.vl_all.values():
for l in v.values():
l.clear()
self.can.update_string(dat, sendcan)
return self.update_vl()
self.update_strings([])
def update_strings(self, strings, sendcan=False):
for v in self.vl_all.values():
for l in v.values():
l.clear()
updated_addrs = set()
for s in strings:
self.can.update_string(s, sendcan)
updated_addrs.update(self.update_vl())
cdef vector[SignalValue] new_vals
cdef unordered_set[uint32_t] updated_addrs
self.can.update_strings(strings, new_vals, sendcan)
cdef vector[SignalValue].iterator it = new_vals.begin()
cdef SignalValue* cv
while it != new_vals.end():
cv = &deref(it)
# Cast char * directly to unicode
cv_name = <unicode>cv.name
self.vl[cv.address][cv_name] = cv.value
self.vl_all[cv.address][cv_name] = cv.all_values
self.ts_nanos[cv.address][cv_name] = cv.ts_nanos
updated_addrs.insert(cv.address)
preinc(it)
return updated_addrs
@property

View File

@ -57,7 +57,7 @@ class TestCanParserPacker(unittest.TestCase):
for i in range(1000):
msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {})
dat = can_list_to_can_capnp([msg, ])
parser.update_string(dat)
parser.update_strings([dat])
self.assertEqual(parser.vl["CAN_FD_MESSAGE"]["COUNTER"], i % 256)
# setting COUNTER should override
@ -67,7 +67,7 @@ class TestCanParserPacker(unittest.TestCase):
"COUNTER": cnt,
})
dat = can_list_to_can_capnp([msg, ])
parser.update_string(dat)
parser.update_strings([dat])
self.assertEqual(parser.vl["CAN_FD_MESSAGE"]["COUNTER"], cnt)
# then, should resume counting from the override value
@ -75,7 +75,7 @@ class TestCanParserPacker(unittest.TestCase):
for i in range(100):
msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {})
dat = can_list_to_can_capnp([msg, ])
parser.update_string(dat)
parser.update_strings([dat])
self.assertEqual(parser.vl["CAN_FD_MESSAGE"]["COUNTER"], (cnt + i) % 256)
def test_parser_can_valid(self):
@ -92,7 +92,7 @@ class TestCanParserPacker(unittest.TestCase):
# not valid until the message is seen
for _ in range(100):
dat = can_list_to_can_capnp([])
parser.update_string(dat)
parser.update_strings([dat])
self.assertFalse(parser.can_valid)
# valid once seen
@ -100,7 +100,7 @@ class TestCanParserPacker(unittest.TestCase):
t = int(0.01 * i * 1e9)
msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, {})
dat = can_list_to_can_capnp([msg, ], logMonoTime=t)
parser.update_string(dat)
parser.update_strings([dat])
self.assertTrue(parser.can_valid)
def test_packer_parser(self):
@ -141,7 +141,7 @@ class TestCanParserPacker(unittest.TestCase):
msgs = [packer.make_can_msg(k, 0, v) for k, v in values.items()]
bts = can_list_to_can_capnp(msgs)
parser.update_string(bts)
parser.update_strings([bts])
for k, v in values.items():
for key, val in v.items():
@ -168,7 +168,7 @@ class TestCanParserPacker(unittest.TestCase):
msgs = packer.make_can_msg("VSA_STATUS", 0, values)
bts = can_list_to_can_capnp([msgs])
parser.update_string(bts)
parser.update_strings([bts])
self.assertAlmostEqual(parser.vl["VSA_STATUS"]["USER_BRAKE"], brake)
@ -199,7 +199,7 @@ class TestCanParserPacker(unittest.TestCase):
msgs = packer.make_can_msg("ES_LKAS", 0, values)
bts = can_list_to_can_capnp([msgs])
parser.update_string(bts)
parser.update_strings([bts])
self.assertAlmostEqual(parser.vl["ES_LKAS"]["LKAS_Output"], steer)
self.assertAlmostEqual(parser.vl["ES_LKAS"]["LKAS_Request"], active)
@ -306,8 +306,8 @@ class TestCanParserPacker(unittest.TestCase):
for _ in range(10):
can_strings = []
log_mono_time = 0
for _ in range(10):
log_mono_time = int(random.uniform(1, 60) * 1e+9)
for i in range(10):
log_mono_time = int(0.01 * i * 1e+9)
can_msg = packer.make_can_msg("VSA_STATUS", 0, {})
can_strings.append(can_list_to_can_capnp([can_msg], logMonoTime=log_mono_time))
parser.update_strings(can_strings)

View File

@ -7,7 +7,6 @@ from opendbc.can.packer import CANPacker
from opendbc.can.tests.test_packer_parser import can_list_to_can_capnp
class TestParser(unittest.TestCase):
def _benchmark(self, signals, checks, thresholds, n):
parser = CANParser('toyota_new_mc_pt_generated', signals, checks, 0, False)
@ -33,15 +32,14 @@ class TestParser(unittest.TestCase):
else:
t1 = time.process_time_ns()
for m in can_msgs:
parser.update_string(m)
parser.update_strings([m])
t2 = time.process_time_ns()
ets.append(t2 - t1)
et = sum(ets) / len(ets)
avg_nanos = et / len(can_msgs)
method = 'update_strings' if n > 1 else 'update_string'
print('%s: [%s] %.1fms to parse %s, avg: %dns' % (self._testMethodName, method, et/1e6, len(can_msgs), avg_nanos))
print('%s: [%d] %.1fms to parse %s, avg: %dns' % (self._testMethodName, n, et/1e6, len(can_msgs), avg_nanos))
minn, maxx = thresholds
self.assertLess(avg_nanos, maxx)
@ -51,8 +49,8 @@ class TestParser(unittest.TestCase):
signals = [
("ACCEL_CMD", "ACC_CONTROL"),
]
self._benchmark(signals, [('ACC_CONTROL', 10)], (5000, 7000), 1)
self._benchmark(signals, [('ACC_CONTROL', 10)], (2200, 3300), 10)
self._benchmark(signals, [('ACC_CONTROL', 10)], (4000, 18000), 1)
self._benchmark(signals, [('ACC_CONTROL', 10)], (700, 3000), 10)
def test_performance_all_signals(self):
signals = [
@ -70,8 +68,8 @@ class TestParser(unittest.TestCase):
("ACCEL_CMD_ALT", "ACC_CONTROL"),
("CHECKSUM", "ACC_CONTROL"),
]
self._benchmark(signals, [('ACC_CONTROL', 10)], (12000, 19000), 1)
self._benchmark(signals, [('ACC_CONTROL', 10)], (7000, 13000), 10)
self._benchmark(signals, [('ACC_CONTROL', 10)], (10000, 19000), 1)
self._benchmark(signals, [('ACC_CONTROL', 10)], (1300, 5000), 10)
if __name__ == "__main__":

View File

@ -396,7 +396,7 @@ CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";

View File

@ -56,7 +56,7 @@ BO_ 361 LKAS: 8 XXX
SG_ LKA_ACTIVE : 52|1@0+ (1,0) [0|15] "" XXX
SG_ SET_0x80_2 : 31|8@0+ (1,0) [0|255] "" XXX
SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [0|255] "" XXX
SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [-1311.43|1310] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 389 STEER_TORQUE_SENSOR: 8 XXX

View File

@ -52,7 +52,7 @@ BO_ 361 LKAS: 8 XXX
SG_ LKA_ACTIVE : 52|1@0+ (1,0) [0|15] "" XXX
SG_ SET_0x80_2 : 31|8@0+ (1,0) [0|255] "" XXX
SG_ COUNTER : 51|4@0+ (1,0) [0|15] "" XXX
SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [0|255] "" XXX
SG_ DESIRED_ANGLE : 7|18@0+ (-0.01,1310) [-1311.43|1310] "" XXX
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
BO_ 389 STEER_TORQUE_SENSOR: 8 XXX

View File

@ -441,7 +441,7 @@ CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";

View File

@ -441,7 +441,7 @@ CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";

View File

@ -441,7 +441,7 @@ CM_ SG_ 835 PERMIT_BRAKING "Original ACC has this going high when a car in front
CM_ SG_ 835 ACCEL_CMD_ALT "Copy of main ACCEL_CMD, but across 8 bits instead of 16 bits like ACCEL_CMD. Unsure if only informational or has an effect. Likely informational as existing openpilot sets this to 0 and no loss of functionality observed. Originally 'AT_RAW' in leaked toyota_2017_ref_pt.dbc file.";
CM_ SG_ 865 GAS_PEDAL_ALT "copy of main GAS_PEDAL. Both use 8 bits. Might indicate that this message is for pedals.";
CM_ SG_ 865 CLUTCH_RELEASED "boolean of clutch for 6MT.";
CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement";
CM_ SG_ 865 ACC_FAULTED "1 when ACC is faulted and the PCM disallows engagement. Also describes a lockout when the ACC_CONTROL->ACC_MALFUNCTION bit is set.";
CM_ SG_ 921 UI_SET_SPEED "set speed shown in the vehicle's UI with the vehicle's unit";
CM_ SG_ 921 TEMP_ACC_FAULTED "1 when the UI is displaying or playing fault-related alerts or sounds. Also 1 when pressing main on.";
CM_ SG_ 951 BRAKE_LIGHTS_ACC "brake lights when ACC commands decel";

View File

@ -1169,28 +1169,39 @@ BO_ 644 Motor_Bremse: 6 XXX
SG_ MOB_Bremsstgr : 16|11@1+ (0.048852,0) [0|100] "Unit_PerCent" Vector__XXX
SG_ MOB_Bremsmom : 27|13@1+ (4,0) [0|32760] "Unit_NewtoMeter" Bremse_MK25AESP
BO_ 870 AWV: 5 XXX
SG_ AWV_2_Gurtstraffer : 39|1@1+ (1,0) [0|1] "" Bremsbooster
SG_ AWV_Infoton : 38|1@1+ (1,0) [0|1] "" Gateway_Kbi_VW_A,Bremsbooster
SG_ AWV_2_Warnsymbol : 37|1@1+ (1,0) [0|1] "" Gateway_Kbi_VW_A,Bremsbooster
SG_ AWV_2_Warnton : 36|1@1+ (1,0) [0|1] "" Gateway_Kbi_VW_A,Bremsbooster
SG_ AWV_2_Ruckprofil : 33|3@1+ (1,0) [0|7] "" Bremsbooster
SG_ AWV_2_Freigabe : 32|1@1+ (1,0) [0|1] "" Bremsbooster
SG_ AWV_2_Umfeldwarn : 31|1@1+ (1,0) [0|1] "" Bremsbooster
SG_ AWV_2_SU_Lampe : 30|1@1+ (1,0) [0|1] "" Bremsbooster
SG_ AWV_2_SU_Gong : 29|1@1+ (1,0) [0|1] "" Bremsbooster
SG_ AWV_2_SU_Bremsruck : 28|1@1+ (1,0) [0|1] "" Bremsbooster
SG_ AWV_2_SU_Warnzeit : 26|2@1+ (1,0) [0|3] "" Bremsbooster
SG_ AWV_2_Fehler : 25|1@1+ (1,0) [0|1] "" Gateway_Kbi_VW_A,Bremsbooster
SG_ AWV_2_Status : 24|1@1+ (1,0) [0|1] "" Gateway_Kbi_VW_A,Bremsbooster
SG_ AWV_res_20 : 20|4@1+ (1,0) [0|0] "" Bremsbooster
SG_ AWV_1_Parameter : 18|2@1+ (1,0) [0|3] "" Bremsbooster
SG_ AWV_1_Prefill : 17|1@1+ (1,0) [0|1] "" Bremsbooster
SG_ AWV_1_Freigabe : 16|1@1+ (1,0) [0|1] "" Bremsbooster
SG_ AWV_Text : 12|4@1+ (1,0) [0|15] "" Gateway_Kbi_VW_A,Bremsbooster
SG_ AWV_Zaehler : 8|4@1+ (1,0) [0|15] "" Bremsbooster
SG_ AWV_Checksumme : 0|8@1+ (1,0) [0|255] "" Bremsbooster
BO_ 870 AWV: 8 XXX
SG_ CHECKSUM : 0|8@1+ (1,0) [0|255] "" Vector__XXX
SG_ COUNTER : 8|4@1+ (1,0) [0|15] "" Vector__XXX
SG_ AWV_Text : 12|4@1+ (1,0) [0|14] "" Vector__XXX
SG_ AWV_1_Freigabe : 16|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_1_Prefill : 17|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_1_Parameter : 18|2@1+ (1,0) [0|3] "" Vector__XXX
SG_ AWV_only : 20|4@1+ (1,0) [0|0] "" Vector__XXX
SG_ AWV_CityANB_Auspraegung : 21|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_Halten : 22|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ ANB_Teilbremsung_Freigabe : 23|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_Status : 24|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_Fehler : 25|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_SU_Warnzeit : 26|2@1+ (1,0) [0|3] "" Vector__XXX
SG_ AWV_2_SU_Bremsruck : 28|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_SU_Gong : 29|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_SU_Lampe : 30|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_Umfeldwarn : 31|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_Freigabe : 32|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_Ruckprofil : 33|3@1+ (1,0) [0|7] "" Vector__XXX
SG_ AWV_2_Warnton : 36|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_Warnsymbol : 37|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_Infoton : 38|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_Gurtstraffer : 39|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_Konfiguration_Menueanf : 40|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_Konfiguration_Vorw_Menueanf : 41|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_Konfiguration_Status : 42|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_Konfiguration_Vorw_Status : 43|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ AWV_2_Abstandswarnung : 51|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ ANB_Zielbremsung_Freigabe : 52|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ ANB_CM_Anforderung : 53|1@1+ (1,0) [0|1] "" Vector__XXX
SG_ ANB_Ziel_Teilbrems_Verz_Anf : 54|10@1+ (0.024,-20.016) [0|1023] "Unit_MeterPerSeconSquar" Vector__XXX
BO_ 1470 LDW_Status: 8 XXX
SG_ LDW_Lernmodus_rechts : 0|2@1+ (1,0) [0|3] "" XXX
SG_ LDW_Lernmodus_links : 2|2@1+ (1,0) [0|3] "" XXX
@ -1543,6 +1554,34 @@ CM_ SG_ 1470 XX_DLCORTLC2 "Might be DLC or TLC, might have wrong size";
CM_ SG_ 1550 MFA_v_Signal_02 "0=km/h, 1=mph";
VAL_ 870 AWV_Text 0 "kein_Text" 1 "FrontAssist_aus" 2 "FrontAssist_startet" 3 "FrontAssist_Warnung" 4 "FrontAssist_Sens_reinig" 5 "FrontAssist_Failure" 6 "FrontAssist_Demo" 7 "Vorhalt" 8 "Bremsung_wird_gerade_durchgefuehrt" 9 "Sensor_not_verfuegbar" 10 "Sensor_reinigen" 11 "Service_notwendig_Failure" 12 "Funktion_vom_Fahrer_deactivated" 13 "Funktion_vom_Fahrer_activated" 14 "FrontAssist_zur_Zeit_not_verfuegbar__rev_Failure";
VAL_ 870 AWV_1_Freigabe 0 "nicht_freigegeben" 1 "freigegeben";
VAL_ 870 AWV_1_Prefill 0 "keine_Prefill_Anf" 1 "Prefill_Anf";
VAL_ 870 AWV_1_Parameter 0 "Defaultparametersatz" 1 "Par_leicht_erh_Empf" 2 "Par_erh_Empf" 3 "Par_hoechster_Empf";
VAL_ 870 AWV_only 0 "ACC_und_AWV_verbaut" 1 "AWV_ohne_ACC_verbaut";
VAL_ 870 AWV_CityANB_Auspraegung 0 "autom_Bremsung_im_ges_vBereich" 1 "autom_Bremsung_im_def_vBereich";
VAL_ 870 AWV_Halten 0 "keine_Anforderung" 1 "Anforderung_das_Fzg_im_Stillstand_zu_halten";
VAL_ 870 ANB_Teilbremsung_Freigabe 0 "Teilbremsung_nicht_freigegeben" 1 "Teilbremsung_freigegeben";
VAL_ 870 AWV_2_Status 0 "Lampe_aus" 1 "Lampe_ein";
VAL_ 870 AWV_2_Fehler 0 "Lampe_aus" 1 "Lampe_ein";
VAL_ 870 AWV_2_SU_Warnzeit 0 "frueh" 1 "normal" 2 "spaet" 3 "adaptiv";
VAL_ 870 AWV_2_SU_Bremsruck 0 "Bremsruck_deaktiviert" 1 "Bremsruck_aktiviert";
VAL_ 870 AWV_2_SU_Gong 0 "Gong_deaktiviert" 1 "Gong_aktiviert";
VAL_ 870 AWV_2_SU_Lampe 0 "Lampe_deaktiviert" 1 "Lampe_aktiviert";
VAL_ 870 AWV_2_Umfeldwarn 0 "keine_Warnung" 1 "Warnung";
VAL_ 870 AWV_2_Freigabe 0 "keine_Ruckfreigabe" 1 "Ruckfreigabe";
VAL_ 870 AWV_2_Ruckprofil 0 "kein_Ruck" 1 "Ruckprofil_1" 2 "Ruckprofil_2" 3 "Ruckprofil_3" 4 "Ruckprofil_4" 5 "Ruckprofil_5" 6 "not_erlaubt" 7 "not_erlaubt";
VAL_ 870 AWV_2_Warnton 0 "Aus" 1 "Ein";
VAL_ 870 AWV_2_Warnsymbol 0 "Aus" 1 "Ein";
VAL_ 870 AWV_Infoton 0 "Aus" 1 "Ein";
VAL_ 870 AWV_2_Gurtstraffer 0 "Gurt_not_straffen" 1 "Gurt_straffen";
VAL_ 870 AWV_Konfiguration_Menueanf 0 "Menue_deaktivieren" 1 "Menue_aktivieren";
VAL_ 870 AWV_Konfiguration_Vorw_Menueanf 0 "Menue_deaktivieren" 1 "Menue_aktivieren";
VAL_ 870 AWV_Konfiguration_Status 0 "AWV_inaktiv" 1 "AWV_aktiv";
VAL_ 870 AWV_Konfiguration_Vorw_Status 0 "AWV_Vorwarnung_inaktiv" 1 "AWV_Vorwarnung_aktiv";
VAL_ 870 AWV_2_Abstandswarnung 0 "kein_Warnhinweis" 1 "Warnhinweis";
VAL_ 870 ANB_Zielbremsung_Freigabe 0 "Zielbremsung_nicht_freigegeben" 1 "Zielbremsung_freigegeben";
VAL_ 870 ANB_CM_Anforderung 0 "keine_Anforderung" 1 "Anforderung_aktiv";
VAL_ 872 ACS_Sta_ADR 2 "ADR_passiv" 0 "ADR_nicht_aktiv" 1 "ADR_aktiv" 3 "irrev_Fehler" ;
VAL_ 872 ACS_ADR_Schub 1 "Verz_begr_auf_Schub" 0 "Verz_nicht_begr_auf_Schub" ;