@@ -119,8 +119,6 @@ def __init__(self, channel, can_filters=None, poll_interval=0.01,
119119 else :
120120 LOG .info ('Install pywin32 to avoid polling' )
121121
122- self .set_filters (can_filters )
123-
124122 try :
125123 vxlapi .xlActivateChannel (self .port_handle , self .mask ,
126124 vxlapi .XL_BUS_TYPE_CAN , 0 )
@@ -133,26 +131,40 @@ def __init__(self, channel, can_filters=None, poll_interval=0.01,
133131 vxlapi .xlGetSyncTime (self .port_handle , offset )
134132 self ._time_offset = time .time () - offset .value * 1e-9
135133
136- super (VectorBus , self ).__init__ ()
137-
138- def set_filters (self , can_filters = None ):
139- if can_filters :
140- # Only one filter per ID type allowed
141- if len (can_filters ) == 1 or (
142- len (can_filters ) == 2 and
143- can_filters [0 ].get ("extended" ) != can_filters [1 ].get ("extended" )):
144- for can_filter in can_filters :
134+ self ._is_filtered = False
135+ super (VectorBus , self ).__init__ (channel = channel , can_filters = can_filters ,
136+ poll_interval = 0.01 , receive_own_messages = False , bitrate = None ,
137+ rx_queue_size = 256 , app_name = "CANalyzer" , ** config )
138+
139+ def _apply_filters (self , filters ):
140+ if filters :
141+ # Only up to one filter per ID type allowed
142+ if len (filters ) == 1 or (len (filters ) == 2 and
143+ filters [0 ].get ("extended" ) != filters [1 ].get ("extended" )):
144+ for can_filter in filters :
145145 try :
146- vxlapi .xlCanSetChannelAcceptance (
147- self .port_handle , self .mask ,
146+ vxlapi .xlCanSetChannelAcceptance (self .port_handle , self .mask ,
148147 can_filter ["can_id" ], can_filter ["can_mask" ],
149148 vxlapi .XL_CAN_EXT if can_filter .get ("extended" ) else vxlapi .XL_CAN_STD )
150149 except VectorError as exc :
151150 LOG .warning ("Could not set filters: %s" , exc )
151+ # go to fallback
152+ else :
153+ self ._is_filtered = True
154+ return
152155 else :
153- LOG .warning ("Only one filter per extended or standard ID allowed" )
156+ LOG .warning ("Only up to one filter per extended or standard ID allowed" )
157+ # go to fallback
158+
159+ # fallback: reset filters
160+ self ._is_filtered = False
161+ try :
162+ vxlapi .xlCanSetChannelAcceptance (self .port_handle , self .mask , 0x0 , 0x0 , vxlapi .XL_CAN_EXT )
163+ vxlapi .xlCanSetChannelAcceptance (self .port_handle , self .mask , 0x0 , 0x0 , vxlapi .XL_CAN_STD )
164+ except VectorError as exc :
165+ LOG .warning ("Could not reset filters: %s" , exc )
154166
155- def recv (self , timeout = None ):
167+ def _recv_internal (self , timeout ):
156168 end_time = time .time () + timeout if timeout is not None else None
157169 event = vxlapi .XLevent (0 )
158170 event_count = ctypes .c_uint ()
@@ -178,10 +190,10 @@ def recv(self, timeout=None):
178190 dlc = dlc ,
179191 data = event .tagData .msg .data [:dlc ],
180192 channel = event .chanIndex )
181- return msg
193+ return msg , self . _is_filtered
182194
183195 if end_time is not None and time .time () > end_time :
184- return None
196+ return None , self . _is_filtered
185197
186198 if HAS_EVENTS :
187199 # Wait for receive event to occur
0 commit comments