From 91a9bb4824381c39b8a15b443d5b265ec550b62b Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 14 May 2024 16:07:37 +0800 Subject: [PATCH 1/2] CANParser: 2x faster parsing (#1039) * update_string() Now 2x Faster * noneed for wraparound and boundscheck * cleanup code d * formatting * these have no effect * minor clean up --------- Co-authored-by: Shane Smiskol --- can/parser_pyx.pyx | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/can/parser_pyx.pyx b/can/parser_pyx.pyx index 8ce67740b0..eddad18ee7 100644 --- a/can/parser_pyx.pyx +++ b/can/parser_pyx.pyx @@ -5,7 +5,6 @@ from cython.operator cimport dereference as deref, preincrement as preinc from libcpp.pair cimport pair from libcpp.string cimport string from libcpp.vector cimport vector -from libcpp.unordered_set cimport unordered_set from libc.stdint cimport uint32_t from .common cimport CANParser as cpp_CANParser @@ -20,6 +19,7 @@ cdef class CANParser: cpp_CANParser *can const DBC *dbc vector[SignalValue] can_values + vector[uint32_t] addresses cdef readonly: dict vl @@ -54,11 +54,12 @@ cdef class CANParser: if address not in address_to_msg_name: raise RuntimeError(f"could not find message {repr(c[0])} in DBC {self.dbc_name}") message_v.push_back((address, c[1])) + self.addresses.push_back(address) name = address_to_msg_name[address] self.vl[address] = {} self.vl[name] = self.vl[address] - self.vl_all[address] = {} + self.vl_all[address] = defaultdict(list) self.vl_all[name] = self.vl_all[address] self.ts_nanos[address] = {} self.ts_nanos[name] = self.ts_nanos[address] @@ -71,24 +72,35 @@ cdef class CANParser: del self.can def update_strings(self, strings, sendcan=False): - for v in self.vl_all.values(): - for l in v.values(): # no-cython-lint - l.clear() + for address in self.addresses: + self.vl_all[address].clear() cdef vector[SignalValue] new_vals - cdef unordered_set[uint32_t] updated_addrs + cur_address = -1 + vl = {} + vl_all = {} + ts_nanos = {} + updated_addrs = set() 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) + + # Check if the address has changed + if cv.address != cur_address: + cur_address = cv.address + vl = self.vl[cur_address] + vl_all = self.vl_all[cur_address] + ts_nanos = self.ts_nanos[cur_address] + updated_addrs.add(cur_address) + # Cast char * directly to unicode cv_name = 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) + vl[cv_name] = cv.value + vl_all[cv_name] = cv.all_values + ts_nanos[cv_name] = cv.ts_nanos preinc(it) return updated_addrs From d53c8f558cc4861ce6563498a3663ee9b57daf4b Mon Sep 17 00:00:00 2001 From: Lukas <61192133+lukasloetkolben@users.noreply.github.com> Date: Thu, 16 May 2024 20:11:10 +0200 Subject: [PATCH 2/2] Tesla Model3 any door open? (#1044) * tesla model 3 dbc files * reduction to the most important signals * Model3 port wip * wip * wip model 3 * wip model 3 * Model 3 wip * wip model 3 * wip model 3 * wip model 3 * wip model 3 partybus * bump opendbc * tesla model 3 * tesla model 3 * tesla model 3 * try to use STW_ACTN_RQ * new dbc * dbc update * remove neutral gear bug * switch to party bus * added doorOpen * VCFRONT_status back to 50hz updated dbc * anyDoor open use different signal * added VCRIGHT_status * indentation * added Left & Right Seatbelt * found DriverSeat signal * found DAS_status on Party can * found "anyDoorOpen" signal --------- Co-authored-by: lukas --- tesla_model3_party.dbc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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" ;