33from contextlib import contextmanager
44from time import sleep
55from typing import Sequence
6+ from warnings import warn
67
78from packaging .version import Version
89from serial import LF , Serial
910from serial .tools .list_ports import comports
1011
11- __all__ = ['TeensyToAny' , 'known_devices' , 'known_serial_numbers' ]
12-
13- known_devices = [
14- # Example device structure
15- # These include useful information about the hardware that is created and
16- # burned in with the serial numbers.
17- # Since the same VID/PID can be assigned to multiple devices,
18- # We must log the individual serial numbers to know what they all do.
19- {
20- 'serial_number' : '4725230' ,
21- 'device_name' : 'teensytoany' ,
22- 'mcu' : 'TEENSY32' ,
23- },
24- {
25- 'serial_number' : '5032260' ,
26- 'device_name' : 'teensytoany' ,
27- 'mcu' : 'TEENSY32' ,
28- },
29- {
30- 'serial_number' : '4725070' ,
31- 'device_name' : 'teensytoany' ,
32- 'mcu' : 'TEENSY32' ,
33- },
34- {
35- 'serial_number' : '4726520' ,
36- 'device_name' : 'teensytoany' ,
37- 'mcu' : 'TEENSY32' ,
38- },
39- {
40- 'serial_number' : '5032540' ,
41- 'device_name' : 'teensytoany' ,
42- 'mcu' : 'TEENSY32' ,
43- },
44- {
45- 'serial_number' : '4728790' ,
46- 'device_name' : 'teensytoany' ,
47- 'mcu' : 'TEENSY32' ,
48- },
49- {
50- 'serial_number' : '5955040' ,
51- 'device_name' : 'teensytoany' ,
52- 'mcu' : 'TEENSY32' ,
53- },
54- ]
55-
56- known_serial_numbers = [
57- d ['serial_number' ]
58- for d in known_devices
59- ]
12+ __all__ = ['TeensyToAny' ]
6013
6114
6215class TeensyToAny :
@@ -76,8 +29,6 @@ class TeensyToAny:
7629 ]
7730
7831 _device_name = "TeensyToAny"
79- _known_device = known_devices
80- _known_serial_numbers = known_serial_numbers
8132
8233 @staticmethod
8334 def find (serial_numbers = None ):
@@ -101,13 +52,18 @@ def find(serial_numbers=None):
10152 computer but that may not be associated with the TeensyToAny boards.
10253
10354 """
104- pairs = TeensyToAny ._device_serial_number_pairs (
55+ pairs = TeensyToAny .device_serial_number_pairs (
10556 serial_numbers = serial_numbers )
10657 devices , _ = zip (* pairs )
10758 return devices
10859
10960 @staticmethod
110- def list_all_serial_numbers (serial_numbers = None , * , device_name = None ):
61+ def list_all_serial_numbers (
62+ serial_numbers = None ,
63+ * ,
64+ device_name = None ,
65+ manufacturer = "TeensyToAny" ,
66+ ):
11167 """Find all the currently connected TeensyToAny serial numbers.
11268
11369 Parameters
@@ -128,8 +84,11 @@ def list_all_serial_numbers(serial_numbers=None, *, device_name=None):
12884 computer but that may not be associated with the TeensyToAny boards.
12985
13086 """
131- pairs = TeensyToAny ._device_serial_number_pairs (
132- serial_numbers = serial_numbers , device_name = device_name )
87+ pairs = TeensyToAny .device_serial_number_pairs (
88+ serial_numbers = serial_numbers ,
89+ device_name = device_name ,
90+ manufacturer = manufacturer ,
91+ )
13392 _ , serial_numbers = zip (* pairs )
13493 return serial_numbers
13594
@@ -177,16 +136,39 @@ def _get_latest_available_firmware_online(*, timeout=2):
177136 return latest_release_version
178137
179138 @staticmethod
180- def _device_serial_number_pairs (serial_numbers = None , * , device_name = None ):
139+ def _device_serial_number_pairs (
140+ serial_numbers = None ,
141+ * ,
142+ device_name = None ,
143+ manufacturer = "TeensyToAny" ,
144+ ):
145+ warn (
146+ "The TeensyToAny._device_serial_number_pairs function is deprecated. "
147+ "Use TeensyToAny.device_serial_number_pairs instead." ,
148+ stacklevel = 2 ,
149+ )
150+ return TeensyToAny .device_serial_number_pairs (
151+ serial_numbers = serial_numbers ,
152+ device_name = device_name ,
153+ manufacturer = manufacturer ,
154+ )
155+
156+ @staticmethod
157+ def device_serial_number_pairs (
158+ serial_numbers = None ,
159+ * ,
160+ device_name = None ,
161+ manufacturer = "TeensyToAny" ,
162+ ):
181163 if device_name is None :
182164 device_name = TeensyToAny ._device_name
183165 com = comports ()
184166 pairs = [
185167 (c .device , c .serial_number )
186168 for c in com
187169 if ((c .vid , c .pid ) in TeensyToAny .VID_PID_s and
188- (serial_numbers is None or
189- c .serial_number in serial_numbers ))
170+ (( serial_numbers is None and c . manufacturer == manufacturer ) or
171+ ( serial_numbers and c .serial_number in serial_numbers ) ))
190172 ]
191173 if len (pairs ) == 0 :
192174 raise RuntimeError (
@@ -397,13 +379,24 @@ def open(self):
397379 self .close ()
398380 raise e
399381
382+ def __enter__ (self ):
383+ """Context manager for opening the device."""
384+ return self
385+
386+ def __exit__ (self , exc_type , exc_value , traceback ):
387+ """Context manager for closing the device."""
388+ self .close ()
389+ if exc_type is not None :
390+ raise exc_value .with_traceback (traceback )
391+ return False
392+
400393 def _open (self ):
401394 if self ._requested_serial_number is None :
402- serial_numbers = self . _known_serial_numbers
395+ serial_numbers = None
403396 else :
404397 serial_numbers = [self ._requested_serial_number ]
405398
406- port , found_serial_number = self ._device_serial_number_pairs (
399+ port , found_serial_number = self .device_serial_number_pairs (
407400 serial_numbers = serial_numbers , device_name = self ._device_name )[0 ]
408401
409402 self ._serial = Serial (
0 commit comments