@@ -782,12 +782,20 @@ def _create_mask(self, match):
782
782
else :
783
783
mask = STDID_BOTTOM_11_MASK
784
784
785
+ # has this mask already been loaded?
786
+ for index , existing_mask in enumerate (self ._masks_in_use ):
787
+ if mask == existing_mask :
788
+ self ._dbg ("Mask Found" , index , existing_mask )
789
+ return index
790
+
785
791
masks_used = len (self ._masks_in_use )
786
792
if masks_used < len (MASKS ):
787
793
next_mask_index = masks_used
788
794
789
795
self ._set_mask_register (next_mask_index , mask , match .extended )
790
- self ._masks_in_use .append (MASKS [next_mask_index ])
796
+ # Append the actual mask to the 'in use' array so later we can
797
+ # find it to use again
798
+ self ._masks_in_use .append (mask )
791
799
return next_mask_index
792
800
793
801
raise RuntimeError ("No Masks Available" )
@@ -875,25 +883,39 @@ def listen(self, matches=None, *, timeout: float = 10):
875
883
Creating a listener is an expensive operation and can interfere with reception of messages
876
884
by other listeners.
877
885
878
- There is an implementation-defined maximum number of listeners and limit to the complexity of
879
- the filters.
886
+ There is an implementation-defined maximum number of listeners and limit to the complexity \
887
+ of the filters.
888
+
889
+ If the hardware cannot support all the requested matches, a ValueError is raised. Note \
890
+ that generally there are some number of hardware filters shared among all fifos.
880
891
881
- If the hardware cannot support all the requested matches, a ValueError is raised. Note that \
882
- generally there are some number of hardware filters shared among all fifos .
892
+ A message can be received by at most one Listener. If more than one listener matches a \
893
+ message, it is undefined which one actually receives it .
883
894
884
- A message can be received by at most one Listener. If more than one listener matches a message,\
885
- it is undefined which one actually receives it.
895
+ The MCP2515 has space for 2 masks (RXM0/RXM1) and 6 filters (RXMF0-RXMF5). \
896
+ Mask RXM0 is paired with 2 filters (RXF0-1) and mask RXM1 is paired with 4 filters \
897
+ (RXF2-5). Read the MCP2515 datasheet for more details on masks and filters.
886
898
887
- An empty filter list causes all messages to be accepted.
899
+ You can use up to 6 matches (match = mask & filter) in the array. \
900
+ The order of the match objects in the array matters. \
901
+ The first unique mask will be placed in RXM0 and can be paired with up to 2 filters. \
902
+ The second unique mask will be placed in RXM1 and can be paired with up to 4 filters. \
903
+ When no mask is defined in the match object, an 'exact match' mask of all 1's will be \
904
+ used. You can use the same mask in multiple matches, however if there are more than \
905
+ 2 unique masks in the matches array, a RuntimeError will be raised. \
906
+ Similarly if there are more than 2 filters used with the first unique mask or \
907
+ more than 4 filters used with the second unique mask a RuntimeError will be raised.
888
908
889
- Timeout dictates how long ``receive()`` will block .
909
+ An empty matches array causes all messages to be accepted .
890
910
891
911
Args:
892
- match (Optional[Sequence[Match]], optional): [description]. Defaults to None.
893
- timeout (float, optional): [description]. Defaults to 10.
912
+ matches ([canio.Match], optional): ID patterns used to restrict the packets received. \
913
+ Defaults to None.
914
+ timeout (float, optional): dictates how long ``receive()`` will block. Defaults to 10.
894
915
895
916
Returns:
896
- Listener: [description]
917
+ `canio.Listener`: Listener object used to receive CANio packets based on the arguments \
918
+ passed into ``listen()``
897
919
"""
898
920
if matches is None :
899
921
matches = []
0 commit comments