diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 71486e7415..aaebd78243 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -22,7 +22,7 @@ jobs: - name: Build opendbc run: ${{ env.RUN }} "cd ../ && scons -j$(nproc) --minimal" - name: Unit tests - run: ${{ env.RUN }} "python -m unittest discover ." + run: ${{ env.RUN }} "pytest" static-analysis: name: static analysis diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7c45c439e2..8b541af667 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -48,6 +48,7 @@ repos: args: - --error-exitcode=1 - --language=c++ + - --inline-suppr - --force - --quiet - -j4 diff --git a/can/common.cc b/can/common.cc index ce7d01132b..9fd9337403 100644 --- a/can/common.cc +++ b/can/common.cc @@ -103,12 +103,16 @@ void gen_crc_lookup_table_16(uint16_t poly, uint16_t crc_lut[]) { } } -void init_crc_lookup_tables() { - // At init time, set up static lookup tables for fast CRC computation. - gen_crc_lookup_table_8(0x2F, crc8_lut_8h2f); // CRC-8 8H2F/AUTOSAR for Volkswagen - gen_crc_lookup_table_8(0x1D, crc8_lut_j1850); // CRC-8 SAE-J1850 - gen_crc_lookup_table_16(0x1021, crc16_lut_xmodem); // CRC-16 XMODEM for HKG CAN FD -} +// Initializes CRC lookup tables at module initialization +struct CrcInitializer { + CrcInitializer() { + gen_crc_lookup_table_8(0x2F, crc8_lut_8h2f); // CRC-8 8H2F/AUTOSAR for Volkswagen + gen_crc_lookup_table_8(0x1D, crc8_lut_j1850); // CRC-8 SAE-J1850 + gen_crc_lookup_table_16(0x1021, crc16_lut_xmodem); // CRC-16 XMODEM for HKG CAN FD + } +}; + +static CrcInitializer crcInitializer; unsigned int volkswagen_mqb_checksum(uint32_t address, const Signal &sig, const std::vector &d) { // Volkswagen uses standard CRC8 8H2F/AUTOSAR, but they compute it with diff --git a/can/common.h b/can/common.h index f0d7ab12a2..c860319b36 100644 --- a/can/common.h +++ b/can/common.h @@ -13,6 +13,7 @@ #include "cereal/gen/cpp/log.capnp.h" #endif +#include "opendbc/can/logger.h" #include "opendbc/can/common_dbc.h" #define INFO printf @@ -23,8 +24,6 @@ #define MAX_BAD_COUNTER 5 #define CAN_INVALID_CNT 5 -void init_crc_lookup_tables(); - // Car specific functions unsigned int honda_checksum(uint32_t address, const Signal &sig, const std::vector &d); unsigned int toyota_checksum(uint32_t address, const Signal &sig, const std::vector &d); @@ -93,11 +92,10 @@ class CANPacker { private: const DBC *dbc = NULL; std::map, Signal> signal_lookup; - std::map message_lookup; std::map counters; public: CANPacker(const std::string& dbc_name); std::vector pack(uint32_t address, const std::vector &values); - Msg* lookup_message(uint32_t address); + const Msg* lookup_message(uint32_t address); }; diff --git a/can/common.pxd b/can/common.pxd index fb0a83f183..9f67724186 100644 --- a/can/common.pxd +++ b/can/common.pxd @@ -6,6 +6,7 @@ from libcpp cimport bool from libcpp.pair cimport pair from libcpp.string cimport string from libcpp.vector cimport vector +from libcpp.unordered_map cimport unordered_map ctypedef unsigned int (*calc_checksum_type)(uint32_t, const Signal&, const vector[uint8_t] &) @@ -49,6 +50,8 @@ cdef extern from "common_dbc.h": string name vector[Msg] msgs vector[Val] vals + unordered_map[uint32_t, const Msg*] addr_to_msg + unordered_map[string, const Msg*] name_to_msg cdef struct SignalValue: uint32_t address diff --git a/can/common_dbc.h b/can/common_dbc.h index 0cd9650de5..b42d3b69ac 100644 --- a/can/common_dbc.h +++ b/can/common_dbc.h @@ -1,8 +1,8 @@ #pragma once -#include #include #include +#include #include struct SignalPackValue { @@ -60,6 +60,8 @@ struct DBC { std::string name; std::vector msgs; std::vector vals; + std::unordered_map addr_to_msg; + std::unordered_map name_to_msg; }; typedef struct ChecksumState { diff --git a/can/dbc.cc b/can/dbc.cc index 39991a82f6..41f9a80d05 100644 --- a/can/dbc.cc +++ b/can/dbc.cc @@ -202,6 +202,8 @@ DBC* dbc_parse_from_stream(const std::string &dbc_name, std::istream &stream, Ch for (auto& m : dbc->msgs) { m.sigs = signals[m.address]; + dbc->addr_to_msg[m.address] = &m; + dbc->name_to_msg[m.name] = &m; } for (auto& v : dbc->vals) { v.sigs = signals[v.address]; diff --git a/can/logger.h b/can/logger.h new file mode 100644 index 0000000000..bab70c4894 --- /dev/null +++ b/can/logger.h @@ -0,0 +1,27 @@ +#pragma once + +#ifdef SWAGLOG +// cppcheck-suppress preprocessorErrorDirective +#include SWAGLOG +#else + +#define CLOUDLOG_DEBUG 10 +#define CLOUDLOG_INFO 20 +#define CLOUDLOG_WARNING 30 +#define CLOUDLOG_ERROR 40 +#define CLOUDLOG_CRITICAL 50 + +#define cloudlog(lvl, fmt, ...) printf(fmt "\n", ## __VA_ARGS__) +#define cloudlog_rl(burst, millis, lvl, fmt, ...) printf(fmt "\n", ##__VA_ARGS__) + +#define LOGD(fmt, ...) cloudlog(CLOUDLOG_DEBUG, fmt, ## __VA_ARGS__) +#define LOG(fmt, ...) cloudlog(CLOUDLOG_INFO, fmt, ## __VA_ARGS__) +#define LOGW(fmt, ...) cloudlog(CLOUDLOG_WARNING, fmt, ## __VA_ARGS__) +#define LOGE(fmt, ...) cloudlog(CLOUDLOG_ERROR, fmt, ## __VA_ARGS__) + +#define LOGD_100(fmt, ...) cloudlog_rl(2, 100, CLOUDLOG_DEBUG, fmt, ## __VA_ARGS__) +#define LOG_100(fmt, ...) cloudlog_rl(2, 100, CLOUDLOG_INFO, fmt, ## __VA_ARGS__) +#define LOGW_100(fmt, ...) cloudlog_rl(2, 100, CLOUDLOG_WARNING, fmt, ## __VA_ARGS__) +#define LOGE_100(fmt, ...) cloudlog_rl(2, 100, CLOUDLOG_ERROR, fmt, ## __VA_ARGS__) + +#endif diff --git a/can/packer.cc b/can/packer.cc index 87fa0a8201..15f49cf6b6 100644 --- a/can/packer.cc +++ b/can/packer.cc @@ -33,16 +33,20 @@ CANPacker::CANPacker(const std::string& dbc_name) { assert(dbc); for (const auto& msg : dbc->msgs) { - message_lookup[msg.address] = msg; for (const auto& sig : msg.sigs) { signal_lookup[std::make_pair(msg.address, sig.name)] = sig; } } - init_crc_lookup_tables(); } std::vector CANPacker::pack(uint32_t address, const std::vector &signals) { - std::vector ret(message_lookup[address].size, 0); + auto msg_it = dbc->addr_to_msg.find(address); + if (msg_it == dbc->addr_to_msg.end()) { + LOGE("undefined address %d", address); + return {}; + } + + std::vector ret(msg_it->second->size, 0); // set all values for all given signal/value pairs bool counter_set = false; @@ -50,7 +54,7 @@ std::vector CANPacker::pack(uint32_t address, const std::vectorsecond; @@ -61,9 +65,9 @@ std::vector CANPacker::pack(uint32_t address, const std::vector CANPacker::pack(uint32_t address, const std::vectoraddr_to_msg.at(address); } diff --git a/can/packer_pyx.pyx b/can/packer_pyx.pyx index 1b9fc8fab6..2e9a6f9292 100644 --- a/can/packer_pyx.pyx +++ b/can/packer_pyx.pyx @@ -1,20 +1,17 @@ # distutils: language = c++ # cython: c_string_encoding=ascii, language_level=3 -from libc.stdint cimport uint8_t +from libc.stdint cimport uint8_t, uint32_t from libcpp.vector cimport vector -from libcpp.map cimport map -from libcpp.string cimport string from .common cimport CANPacker as cpp_CANPacker -from .common cimport dbc_lookup, SignalPackValue, DBC +from .common cimport dbc_lookup, SignalPackValue, DBC, Msg cdef class CANPacker: cdef: cpp_CANPacker *packer const DBC *dbc - map[string, int] name_to_address def __init__(self, dbc_name): self.dbc = dbc_lookup(dbc_name) @@ -22,9 +19,6 @@ cdef class CANPacker: raise RuntimeError(f"Can't lookup {dbc_name}") self.packer = new cpp_CANPacker(dbc_name) - for i in range(self.dbc[0].msgs.size()): - msg = self.dbc[0].msgs[i] - self.name_to_address[string(msg.name)] = msg.address def __dealloc__(self): if self.packer: @@ -43,11 +37,17 @@ cdef class CANPacker: return self.packer.pack(addr, values_thing) cpdef make_can_msg(self, name_or_addr, bus, values): - cdef int addr + cdef uint32_t addr = 0 + cdef const Msg* m if isinstance(name_or_addr, int): addr = name_or_addr else: - addr = self.name_to_address[name_or_addr.encode("utf8")] + try: + m = self.dbc.name_to_msg.at(name_or_addr.encode("utf8")) + addr = m.address + except IndexError: + # The C++ pack function will log an error message for invalid addresses + pass cdef vector[uint8_t] val = self.pack(addr, values) return [addr, 0, (&val[0])[:val.size()], bus] diff --git a/can/parser.cc b/can/parser.cc index 3ed9f02880..d36ec75bad 100644 --- a/can/parser.cc +++ b/can/parser.cc @@ -10,7 +10,6 @@ #include #include -#include "cereal/logger/logger.h" #include "opendbc/can/common.h" int64_t get_raw_value(const std::vector &msg, const Signal &sig) { @@ -65,7 +64,7 @@ bool MessageState::parse(uint64_t nanos, const std::vector &dat) { // only update values if both checksum and counter are valid if (checksum_failed || counter_failed) { - LOGE("0x%X message checks failed, checksum failed %d, counter failed %d", address, checksum_failed, counter_failed); + LOGE_100("0x%X message checks failed, checksum failed %d, counter failed %d", address, checksum_failed, counter_failed); return false; } @@ -97,7 +96,6 @@ CANParser::CANParser(int abus, const std::string& dbc_name, const std::vector(1024)) { dbc = dbc_lookup(dbc_name); assert(dbc); - init_crc_lookup_tables(); bus_timeout_threshold = std::numeric_limits::max(); @@ -121,18 +119,7 @@ CANParser::CANParser(int abus, const std::string& dbc_name, const std::vectormsgs) { - if (m.address == address) { - msg = &m; - break; - } - } - if (!msg) { - fprintf(stderr, "CANParser: could not find message 0x%X in DBC %s\n", address, dbc_name.c_str()); - assert(false); - } - + const Msg *msg = dbc->addr_to_msg.at(address); state.name = msg->name; state.size = msg->size; assert(state.size <= 64); // max signal size is 64 bytes @@ -150,7 +137,6 @@ CANParser::CANParser(int abus, const std::string& dbc_name, bool ignore_checksum dbc = dbc_lookup(dbc_name); assert(dbc); - init_crc_lookup_tables(); for (const auto& msg : dbc->msgs) { MessageState state = { @@ -238,7 +224,10 @@ void CANParser::UpdateCans(uint64_t nanos, const capnp::List::R // continue; //} - std::vector data(dat.size(), 0); + // TODO: can remove when we ignore unexpected can msg lengths + // make sure the data_size is not less than state_it->second.size + size_t data_size = std::max(dat.size(), state_it->second.size); + std::vector data(data_size, 0); memcpy(data.data(), dat.begin(), dat.size()); state_it->second.parse(nanos, data); } @@ -290,9 +279,9 @@ void CANParser::UpdateValid(uint64_t nanos) { if (state.check_threshold > 0 && (missing || timed_out)) { if (show_missing && !bus_timeout) { if (missing) { - LOGE("0x%X '%s' NOT SEEN", state.address, state.name.c_str()); + LOGE_100("0x%X '%s' NOT SEEN", state.address, state.name.c_str()); } else if (timed_out) { - LOGE("0x%X '%s' TIMED OUT", state.address, state.name.c_str()); + LOGE_100("0x%X '%s' TIMED OUT", state.address, state.name.c_str()); } } _valid = false; diff --git a/can/parser_pyx.pyx b/can/parser_pyx.pyx index eddad18ee7..a5b802dfce 100644 --- a/can/parser_pyx.pyx +++ b/can/parser_pyx.pyx @@ -36,27 +36,21 @@ cdef class CANParser: self.vl = {} self.vl_all = {} self.ts_nanos = {} - msg_name_to_address = {} - address_to_msg_name = {} - - for i in range(self.dbc[0].msgs.size()): - msg = self.dbc[0].msgs[i] - name = msg.name.decode("utf8") - - msg_name_to_address[name] = msg.address - address_to_msg_name[msg.address] = name # Convert message names into addresses and check existence in DBC cdef vector[pair[uint32_t, int]] message_v for i in range(len(messages)): c = messages[i] - address = c[0] if isinstance(c[0], numbers.Number) else msg_name_to_address.get(c[0]) - if address not in address_to_msg_name: + try: + m = self.dbc.addr_to_msg.at(c[0]) if isinstance(c[0], numbers.Number) else self.dbc.name_to_msg.at(c[0]) + except IndexError: raise RuntimeError(f"could not find message {repr(c[0])} in DBC {self.dbc_name}") + + address = m.address message_v.push_back((address, c[1])) self.addresses.push_back(address) - name = address_to_msg_name[address] + name = m.name.decode("utf8") self.vl[address] = {} self.vl[name] = self.vl[address] self.vl_all[address] = defaultdict(list) @@ -128,14 +122,6 @@ cdef class CANDefine(): if not self.dbc: raise RuntimeError(f"Can't find DBC: '{dbc_name}'") - address_to_msg_name = {} - - for i in range(self.dbc[0].msgs.size()): - msg = self.dbc[0].msgs[i] - name = msg.name.decode("utf8") - address = msg.address - address_to_msg_name[address] = name - dv = defaultdict(dict) for i in range(self.dbc[0].vals.size()): @@ -144,7 +130,11 @@ cdef class CANDefine(): sgname = val.name.decode("utf8") def_val = val.def_val.decode("utf8") address = val.address - msgname = address_to_msg_name[address] + try: + m = self.dbc.addr_to_msg.at(address) + except IndexError: + raise KeyError(address) + msgname = m.name.decode("utf-8") # separate definition/value pairs def_val = def_val.split() diff --git a/can/tests/test_packer_parser.py b/can/tests/test_packer_parser.py index 8c3653a220..c313805c47 100755 --- a/can/tests/test_packer_parser.py +++ b/can/tests/test_packer_parser.py @@ -60,6 +60,7 @@ def test_packer_counter(self): cnt = random.randint(0, 255) msg = packer.make_can_msg("CAN_FD_MESSAGE", 0, { "COUNTER": cnt, + "SIGNED": 0 }) dat = can_list_to_can_capnp([msg, ]) parser.update_strings([dat]) @@ -381,6 +382,18 @@ def test_disallow_duplicate_messages(self): with self.assertRaises(RuntimeError): CANParser("toyota_nodsu_pt_generated", [("ACC_CONTROL", 10), ("ACC_CONTROL", 10)]) + def test_allow_undefined_msgs(self): + # TODO: we should throw an exception for these, but we need good + # discovery tests in openpilot first + packer = CANPacker("toyota_nodsu_pt_generated") + + self.assertEqual(packer.make_can_msg("ACC_CONTROL", 0, {"UNKNOWN_SIGNAL": 0}), + [835, 0, b'\x00\x00\x00\x00\x00\x00\x00N', 0]) + self.assertEqual(packer.make_can_msg("UNKNOWN_MESSAGE", 0, {"UNKNOWN_SIGNAL": 0}), + [0, 0, b'', 0]) + self.assertEqual(packer.make_can_msg(0, 0, {"UNKNOWN_SIGNAL": 0}), + [0, 0, b'', 0]) + if __name__ == "__main__": unittest.main() diff --git a/ford_lincoln_base_pt.dbc b/ford_lincoln_base_pt.dbc index acd45e796b..828e4118ee 100644 --- a/ford_lincoln_base_pt.dbc +++ b/ford_lincoln_base_pt.dbc @@ -1756,6 +1756,14 @@ BO_ 126 SteeringPinion_Data: 8 PSCM SG_ StePinAn_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" VDM,ABS_ESC,TCCM,GWM SG_ StePinAn_No_Cnt : 47|4@0+ (1,0) [0|15] "unitless" VDM,TCCM,GWM,ABS_ESC +BO_ 133 SteeringPinion_Data_Alt: 8 PSCM + SG_ StePw_B_Rq : 23|1@0+ (1,0) [0|1] "SED" GWM,ECM_Diesel,PCM + SG_ StePinRelInit_An_Sns : 7|16@0+ (0.1,-3200) [-3200|3353.3] "degrees" VDM,IPMA_ADAS,GWM,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM + SG_ StePinCompAnEst_D_Qf : 43|2@0+ (1,0) [0|3] "SED" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM + SG_ StePinComp_An_Est : 22|15@0+ (0.1,-1600) [-1600|1676.7] "degrees" VDM,CMR_DSMC,IPMA_ADAS,TCM_DSL,ECM_Diesel,PCM,PCM_HEV,ABS_ESC,TCCM,GWM + SG_ StePinAn_No_Cs : 39|8@0+ (1,0) [0|255] "Unitless" VDM,ABS_ESC,TCCM,GWM + SG_ StePinAn_No_Cnt : 47|4@0+ (1,0) [0|15] "unitless" VDM,TCCM,GWM,ABS_ESC + BO_ 1430 ABS_AutoSar_NetworkMgt: 8 ABS_ESC SG_ ABS_GWOnBoardTester : 39|8@0+ (1,0) [0|255] "unitless" GWM SG_ ABS_GWNMProxy : 47|8@0+ (1,0) [0|255] "unitless" GWM @@ -3697,6 +3705,9 @@ CM_ SG_ 130 SteMdule_U_Meas "DCR 1745 to update Tx from GWM to EP100ms. SteMdul CM_ SG_ 130 SteMdule_I_Est "DCR 1745 to update Tx from GWM to EP100ms. SteMdule_I_Est & SteMdule_U_Meas are used by BMS system & filtered. The filter uses standard periodic rate & changing to EP would adversely affect the filter.(jweinfur)"; CM_ SG_ 126 StePinRelInit_An_Sns "SASM will transmit these signals on vehicles with SASM and without PSCM. SCCM will not Tx this signal when SASM is present."; CM_ SG_ 126 StePinAn_No_Cs "Signal not transmitted on gas variants."; +CM_ BO_ 133 "Seen on Ford Edge MK2"; +CM_ SG_ 133 StePinRelInit_An_Sns "SASM will transmit these signals on vehicles with SASM and without PSCM. SCCM will not Tx this signal when SASM is present."; +CM_ SG_ 133 StePinAn_No_Cs "Signal not transmitted on gas variants."; CM_ SG_ 1200 BrkTot_Tq_RqDrv "DCR 1836 to update Tx from GWM to EP100ms rejected due MPS6 TCM requires BrkTot_Tq_RqDrv at 20ms (bshu1)."; CM_ SG_ 1046 TCMode "Signal data set to 0x0 for ABS only vehicle option content"; CM_ SG_ 1046 DrvAntiLckLamp_D_Rq "update value table v8.34, not align w/GSDB, need etracker. ABS & IPC implemented as updated."; @@ -4941,6 +4952,11 @@ BA_ "GenMsgSendType" BO_ 126 0; BA_ "GenMsgCycleTime" BO_ 126 10; BA_ "GenMsgDelayTime" BO_ 126 0; BA_ "VFrameFormat" BO_ 126 14; +BA_ "FrameRouting" BO_ 133 ""; +BA_ "GenMsgSendType" BO_ 133 0; +BA_ "GenMsgCycleTime" BO_ 133 10; +BA_ "GenMsgDelayTime" BO_ 133 0; +BA_ "VFrameFormat" BO_ 133 14; BA_ "FrameRouting" BO_ 1430 ""; BA_ "GenMsgILSupport" BO_ 1430 0; BA_ "NmAsrMessage" BO_ 1430 1; @@ -11581,6 +11597,9 @@ VAL_ 130 SAPPAngleControlStat1 3 "Fault" 2 "Active" 1 "Open" 0 "Closed"; VAL_ 126 StePw_B_Rq 1 "Yes" 0 "No"; VAL_ 126 StePinRelInit_An_Sns 65535 "Faulty" 65534 "NoDataExists"; VAL_ 126 StePinCompAnEst_D_Qf 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty"; +VAL_ 133 StePw_B_Rq 1 "Yes" 0 "No"; +VAL_ 133 StePinRelInit_An_Sns 65535 "Faulty" 65534 "NoDataExists"; +VAL_ 133 StePinCompAnEst_D_Qf 3 "OK" 2 "Degraded" 1 "No_Data_Exists" 0 "Faulty"; VAL_ 1200 BrkHold_D_Stat 7 "NotUsed_3" 6 "NotUsed_2" 5 "NotUsed_1" 4 "HeldSecondary" 3 "HeldSecure" 2 "Held" 1 "Inactive" 0 "Off"; VAL_ 1200 HsaTrnAout_Tq_Rq 65535 "Fault" 65534 "Unknown"; VAL_ 1200 BrkBstrVac_P_Actl 127 "Invalid"; diff --git a/requirements.txt b/requirements.txt index f45b65fcb9..10f8414dda 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ numpy pycapnp pyyaml scons +pytest diff --git a/tesla_model3_party.dbc b/tesla_model3_party.dbc index f727f3264e..fa1b72b249 100644 --- a/tesla_model3_party.dbc +++ b/tesla_model3_party.dbc @@ -185,8 +185,9 @@ BO_ 646 DI_state: 7 ETH SG_ DI_locStatusCounter : 8|4@1+ (1,0) [0|0] "" X SG_ DI_locStatusChecksum : 0|8@1+ (1,0) [0|0] "" X -BO_ 785 DriverSeat: 7 XXX +BO_ 785 UI_warning: 7 XXX SG_ buckleStatus : 13|1@0+ (1,0) [0|1] "" XXX + SG_ anyDoorOpen : 28|1@0+ (1,0) [0|1] "" XXX BO_ 923 DAS_status: 8 PARTY SG_ DAS_statusChecksum : 56|8@1+ (1,0) [0|255] "" aps @@ -307,6 +308,7 @@ VAL_ 646 DI_autoparkState 0 "UNAVAILABLE" 1 "STANDBY" 2 "STARTED" 3 "ACTIVE" 4 " VAL_ 646 DI_speedUnits 0 "MPH" 1 "KPH" ; VAL_ 646 DI_cruiseState 0 "UNAVAILABLE" 1 "STANDBY" 2 "ENABLED" 3 "STANDSTILL" 4 "OVERRIDE" 5 "FAULT" 6 "PRE_FAULT" 7 "PRE_CANCEL" ; VAL_ 785 buckleStatus 1 "LATCHED" 0 "UNLATCHED" ; +VAL_ 785 anyDoorOpen 1 "OPEN" 0 "CLOSED" ; VAL_ 923 DAS_autoLaneChangeState 5 "ALC_UNAVAILABLE_VEHICLE_SPEED" 17 "ALC_ABORT_POOR_VIEW_RANGE" 23 "ALC_BLOCKED_VEH_TTC_AND_USS_L" 0 "ALC_UNAVAILABLE_DISABLED" 26 "ALC_BLOCKED_LANE_TYPE_L" 29 "ALC_ABORT_TIMEOUT" 9 "ALC_IN_PROGRESS_L" 4 "ALC_UNAVAILABLE_EXITING_HIGHWAY" 22 "ALC_BLOCKED_VEH_TTC_L" 12 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_R" 18 "ALC_ABORT_LC_HEALTH_BAD" 28 "ALC_WAITING_HANDS_ON" 8 "ALC_AVAILABLE_BOTH" 11 "ALC_WAITING_FOR_SIDE_OBST_TO_PASS_L" 3 "ALC_UNAVAILABLE_TP_FOLLOW" 2 "ALC_UNAVAILABLE_SONICS_INVALID" 21 "ALC_UNAVAILABLE_SOLID_LANE_LINE" 24 "ALC_BLOCKED_VEH_TTC_R" 1 "ALC_UNAVAILABLE_NO_LANES" 25 "ALC_BLOCKED_VEH_TTC_AND_USS_R" 30 "ALC_ABORT_MISSION_PLAN_INVALID" 27 "ALC_BLOCKED_LANE_TYPE_R" 19 "ALC_ABORT_BLINKER_TURNED_OFF" 31 "ALC_SNA" 13 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_L" 16 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_R" 6 "ALC_AVAILABLE_ONLY_L" 20 "ALC_ABORT_OTHER_REASON" 15 "ALC_ABORT_SIDE_OBSTACLE_PRESENT_L" 7 "ALC_AVAILABLE_ONLY_R" 14 "ALC_WAITING_FOR_FWD_OBST_TO_PASS_R" 10 "ALC_IN_PROGRESS_R" ; VAL_ 923 DAS_autopilotHandsOnState 8 "LC_HANDS_ON_SUSPENDED" 15 "LC_HANDS_ON_SNA" 7 "LC_HANDS_ON_REQD_STRUCK_OUT" 3 "LC_HANDS_ON_REQD_VISUAL" 4 "LC_HANDS_ON_REQD_CHIME_1" 6 "LC_HANDS_ON_REQD_SLOWING" 1 "LC_HANDS_ON_REQD_DETECTED" 2 "LC_HANDS_ON_REQD_NOT_DETECTED" 5 "LC_HANDS_ON_REQD_CHIME_2" 0 "LC_HANDS_ON_NOT_REQD" ; VAL_ 923 DAS_fleetSpeedState 0 "FLEETSPEED_UNAVAILABLE" 1 "FLEETSPEED_AVAILABLE" 2 "FLEETSPEED_ACTIVE" 3 "FLEETSPEED_HOLD" ; diff --git a/vw_mqb_2010.dbc b/vw_mqb_2010.dbc index 91bfffd96f..44ec0cd3e0 100644 --- a/vw_mqb_2010.dbc +++ b/vw_mqb_2010.dbc @@ -1145,19 +1145,43 @@ BO_ 288 TSK_06: 8 Motor_Diesel_MQB SG_ TSK_Status : 24|3@1+ (1,0) [0|7] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB SG_ TSK_v_Begrenzung_aktiv : 27|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB SG_ TSK_Standby_Anf_ESP : 28|1@1+ (1,0) [0|1] "" Gateway_MQB + SG_ TSK_Freig_WU : 29|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB SG_ TSK_Freig_Verzoeg_Anf : 30|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB SG_ TSK_Limiter_ausgewaehlt : 31|1@1+ (1,0) [0|1] "" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB + SG_ TSK_Wunsch_Uebersetz : 32|10@1+ (0.0245,0) [0.0245|25.0635] "" Gateway_MQB + SG_ TSK_Hauptschalter_GRA_ACC : 42|2@1+ (1.0,0.0) [0.0|3] "" Gateway_MQB + SG_ TSK_SRBM_Anf_ASIL : 44|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB SG_ TSK_ax_Getriebe_02 : 48|9@1+ (0.024,-2.016) [-2.016|10.224] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB SG_ TSK_Zwangszusch_ESP : 57|1@1+ (1,0) [0|1] "" Gateway_MQB SG_ TSK_zul_Regelabw : 58|6@1+ (0.024,0) [0|1.512] "Unit_MeterPerSeconSquar" Gateway_MQB,Getriebe_DQ_Hybrid_MQB,Getriebe_DQ_MQB BO_ 798 TSK_07: 8 Motor_Diesel_MQB - SG_ TSK_07_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB - SG_ TSK_07_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB - SG_ TSK_Wunschgeschw : 12|10@1+ (0.32,0) [0|326.72] "Unit_KiloMeterPerHour" Gateway_MQB - SG_ TSK_Texte_Primaeranz : 48|5@1+ (1,0) [0|31] "" Gateway_MQB - SG_ TSK_Limiter_Anzeige : 55|1@1+ (1,0) [0|1] "" Gateway_MQB - SG_ TSK_Status_Anzeige : 61|3@1+ (1,0) [0|7] "" Gateway_MQB + SG_ TSK_07_CRC : 0|8@1+ (1,0) [0|255] "" Gateway_MQB,Getriebe_AQ + SG_ TSK_07_BZ : 8|4@1+ (1,0) [0|15] "" Gateway_MQB,Getriebe_AQ + SG_ TSK_Wunschgeschw : 12|10@1+ (0.32,0) [0.00|326.72] "Unit_KiloMeterPerHour" Gateway_MQB,Getriebe_AQ + SG_ TSK_Texte : 40|5@1+ (1.0,0.0) [0.0|31] "" Gateway_MQB + SG_ TSK_Akustik : 45|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB + SG_ TSK_Texte_Primaeranz : 48|5@1+ (1.0,0.0) [0.0|31] "" Gateway_MQB + SG_ TSK_Limiter_Fahrerinfo : 53|2@1+ (1.0,0.0) [0.0|3] "" Gateway_MQB + SG_ TSK_Limiter_Anzeige : 55|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ TSK_Fahrzeugstatus_GRA : 56|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ TSK_Fahrzeugstatus_Limiter : 57|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ MO_Motorlaufwarnung : 58|1@1+ (1.0,0.0) [0.0|1] "" Gateway_MQB + SG_ TSK_Status_Anzeige : 61|3@1+ (1.0,0.0) [0.0|7] "" Gateway_MQB + +BO_ 346 TSK_08: 8 Motor_Diesel_MQB + SG_ TSK_08_CRC : 0|8@1+ (1,0) [0|255] "" Frontradar + SG_ TSK_08_BZ : 8|4@1+ (1,0) [0|15] "" Frontradar + SG_ MO_Anforderung_HMS : 12|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_Status_EA : 32|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_vMax_Fahrerassistenz : 40|9@1+ (1,0) [0|510] "" Frontradar + SG_ TSK_Einheit_vMax_Fahrerassistenz : 49|1@1+ (1,0) [0|1] "" Frontradar + SG_ TSK_Status_PLA : 50|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_aktives_System : 53|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_erhoehter_Fahrwiderstand : 56|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_Anf_Antriebsmoment : 57|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TSK_Status_ARA : 58|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ TSK_Status_IPA : 61|3@1+ (1,0) [0|7] "" Vector__XXX BO_ 1716 VIN_01: 8 Gateway_MQB SG_ VIN_01_MUX M : 0|2@1+ (1,0) [0|3] "" Airbag_MQB @@ -1482,6 +1506,15 @@ CM_ SG_ 1720 KBI_Variante_USA "In diesem Signal wird die HW-Variante des Kombis VAL_ 159 EPS_HCA_Status 0 "disabled" 1 "initializing" 2 "fault" 3 "ready" 4 "rejected" 5 "active" 8 "preempted" ; VAL_ 173 GE_Fahrstufe 5 "P" 6 "R" 7 "N" 8 "D" 9 "S" 10 "E" 13 "T" 14 "T" ; VAL_ 288 TSK_Status 0 "init" 1 "disabled" 2 "enabled" 3 "regulating" 4 "accel_pedal_override" 5 "brake_only" 6 "temp_fault" 7 "perm_fault" ; +VAL_ 288 TSK_v_Begrenzung_aktiv 0 "inaktiv" 1 "aktiv" ; +VAL_ 288 TSK_Standby_Anf_ESP 0 "keine_Standby_Anforderung" 1 "Standby_Anforderung" ; +VAL_ 288 TSK_Freig_WU 0 "TSK_Uebersetzungswunsch_nicht_freigegeben" 1 "TSK_Uebersetzungswunsch_freigegeben" ; +VAL_ 288 TSK_Freig_Verzoeg_Anf 0 "Verzoegerungsanforderung_nicht_freigegeben" 1 "Verzoegerungsanforderung_freigegeben" ; +VAL_ 288 TSK_Limiter_ausgewaehlt 0 "kein_Limiter_ausgewaehlt" 1 "Limiter_ausgewaehlt" ; +VAL_ 288 TSK_Wunsch_Uebersetz 0 "Init" ; +VAL_ 288 TSK_Hauptschalter_GRA_ACC 0 "Init" 1 "Aus" 2 "Ein" 3 "Fehler" ; +VAL_ 288 TSK_ax_Getriebe_02 511 "Neutralwert" ; +VAL_ 288 TSK_Zwangszusch_ESP 0 "keine_ESP_ASR_Beeinflussung" 1 "ESP_ASR_Beeinflussung" ; VAL_ 294 EA_ACC_Sollstatus 0 "Init" 1 "ACC_aktivieren" 2 "ACC_deaktivieren" ; VAL_ 294 EA_Ruckprofil 0 "Init" 1 "Profil_1" 2 "Profil_2" 3 "Profil_3" 4 "Profil_4" 5 "Profil_5" 6 "Profil_6" 7 "Profil_7" ; VAL_ 294 HCA_01_Sendestatus 0 "HCA_sendet_mit_1000ms" 1 "HCA_sendet_mit_20ms" ; @@ -1489,6 +1522,26 @@ VAL_ 294 HCA_01_LM_OffSign 0 "positives_Vorzeichen" 1 "negatives_Vorzeichen" ; VAL_ 294 HCA_01_Status_HCA 0 "deaktiviert" 1 "reserviert" 2 "reserviert" 3 "funktionsbereit" 4 "reserviert" 5 "HCA_Momenteneingriff_1" 6 "MA_Aktiv" 7 "HCA_Momenteneingriff_2" 8 "reserviert" 9 "reserviert" 10 "reserviert" 11 "reserviert" 12 "reserviert" 13 "reserviert" 14 "reserviert" 15 "reserviert" ; VAL_ 294 EA_Ruckfreigabe 0 "keine_Freigabe" 1 "Freigabe" ; VAL_ 294 EA_ACC_Wunschgeschwindigkeit 1023 "Init" ; +VAL_ 346 MO_Anforderung_HMS 0 "keine_Anforderung" 1 "halten" 2 "parken" 3 "halten_Standby" 4 "anfahren" 5 "Loesen_ueber_Rampe" ; +VAL_ 346 TSK_Status_EA 0 "Aus" 1 "Init_oder_nicht_verbaut" 3 "Aktiv" 4 "Uebertreten" 5 "Abschaltung_laeuft" 6 "Reversibel_aus" 7 "Irreversibel_Aus" ; +VAL_ 346 TSK_vMax_Fahrerassistenz 511 "Init_ungueltig_keine_Beschraenkung" ; +VAL_ 346 TSK_Einheit_vMax_Fahrerassistenz 0 "kmh" 1 "mph" ; +VAL_ 346 TSK_Status_PLA 0 "Aus_Funktionsbereit" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "Abschaltung_laeuft" 6 "reversibel_aus" 7 "Fehler" ; +VAL_ 346 TSK_aktives_System 0 "keine_Funktion_aktiv" 1 "GRA_ACC" 2 "ARA" 3 "Speedlimiter" 4 "IPA" 5 "PLA" 6 "PEA_Ausrollassistent" 7 "EA" ; +VAL_ 346 TSK_erhoehter_Fahrwiderstand 0 "kein_erhoehter_Fahrwiderstand" 1 "erhoehter_Fahrwiderstand" ; +VAL_ 346 TSK_Anf_Antriebsmoment 0 "keine_Anforderung" 1 "Anforderung_aktiv" ; +VAL_ 346 TSK_Status_ARA 0 "Aus" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "abschaltung_laeuft" 6 "reversibel_aus" 7 "Fehler" ; +VAL_ 346 TSK_Status_IPA 0 "Aus_Funktionsbereit" 1 "Init_oder_nicht_verbaut" 2 "aktivierbar" 3 "aktiv" 5 "Abschaltung_laueft" 6 "reversibel_aus" 7 "Fehler" ; +VAL_ 798 TSK_Wunschgeschw 1022 "keine_Anzeige" 1023 "kein_Wert_im_Speicher" ; +VAL_ 798 TSK_Texte 0 "kein_Text" 1 "GRA_Modus_ausgewaehlt" 2 "ACC_Modus_ausgewaehlt" 3 "Lim_Modus_ausgewaehlt" 4 "Lim_nicht_verfuegbar_ESC_passiv" 5 "GRA_nicht_verfuegbar_ESC_passiv" 6 "Lim_nicht_verfuegbar_Charisma" 7 "GRA_nicht_verfuegbar_Charisma" 8 "Lim_nicht_verfuegbar_HDC" 9 "GRA_nicht_verfuegbar_HDC" ; +VAL_ 798 TSK_Akustik 0 "keine_Akustik" 1 "einzelner_Warnton" 2 "dauerhafter_Warnton" ; +VAL_ 798 TSK_Texte_Primaeranz 0 "keine_Anzeige" 1 "GRA_Symbol_passiv_xxx_kmh_mph" 2 "GRA_Symbol_aktiv_xxx_kmh_mph" 3 "Bremse_ueberhitzt" 4 "Limiter_Modus_aktiviert" 5 "GRA_Modus_aktiviert" 6 "ACC_Modus_aktiviert" 7 "Opt_Geschwindigkeitswarnung" 8 "Opt_und_akustische_GeschwWarnung" 9 "Opt_GeschwWarnung_dauerhaft_mit_einmal_Akustik" 10 "Limiter_passiv_mit_Akustik" 11 "Limiter_Fehler_mit_Akustik" 12 "Limiter_Symbol_passiv_xxx_kmh_mph" 13 "Limiter_Symbol_aktiv_xxx_kmh_mph" 14 "Popup_Geschw_zu_hoch__Resume_unzulaessig" ; +VAL_ 798 TSK_Limiter_Fahrerinfo 0 "keine_Info" 1 "Limit_erreicht" 2 "Ueberschritten" 3 "Vom_Fahrer_Ueberstimmt" ; +VAL_ 798 TSK_Limiter_Anzeige 0 "Display_Anzeige_GRA_ACC" 1 "Display_Anzeige_Limiter" ; +VAL_ 798 TSK_Fahrzeugstatus_GRA 0 "GRA_verfuegbar" 1 "GRA_nicht_verfuegbar" ; +VAL_ 798 TSK_Fahrzeugstatus_Limiter 0 "Limiter_verfuegbar" 1 "Limiter_nicht_verfuegbar" ; +VAL_ 798 MO_Motorlaufwarnung 0 "keine_Anzeige" 1 "Anforderung_Motorlaufwarnung" ; +VAL_ 798 TSK_Status_Anzeige 0 "Hauptschalter_aus" 1 "Init" 2 "passiv" 3 "aktiv" 4 "Uebertreten" 5 "Limitiierung_aktiv" 6 "reversibel_aus" 7 "irreversibel_aus" ; VAL_ 780 ACC_Wunschgeschw_02 1023 "keine_Anzeige" ; VAL_ 780 ACC_Status_Prim_Anz 0 "Symbol nicht beleuchtet" 1 "Farbe 1 (typisch 'gruen')" 2 "Farbe 2 (typisch 'rot')" 3 "Farbe 3 (typisch 'gelb')" ; VAL_ 780 ACC_Abstandsindex 0 "Sonderanzeige_graue_Fahrbahn" 1022 "Sonderanzeige_graue_Fahrbahn" 1023 "Sonderanzeige_Fahrbahn_mit_gruenem_roten_Bereich" ;