OLD | NEW |
---|---|
1 # Copyright 2014 Google Inc. All rights reserved. | 1 # Copyright 2014 Google Inc. All rights reserved. |
2 # | 2 # |
3 # Licensed under the Apache License, Version 2.0 (the "License"); | 3 # Licensed under the Apache License, Version 2.0 (the "License"); |
4 # you may not use this file except in compliance with the License. | 4 # you may not use this file except in compliance with the License. |
5 # You may obtain a copy of the License at | 5 # You may obtain a copy of the License at |
6 # | 6 # |
7 # http://www.apache.org/licenses/LICENSE-2.0 | 7 # http://www.apache.org/licenses/LICENSE-2.0 |
8 # | 8 # |
9 # Unless required by applicable law or agreed to in writing, software | 9 # Unless required by applicable law or agreed to in writing, software |
10 # distributed under the License is distributed on an "AS IS" BASIS, | 10 # distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
86 self._write_endpoint = None | 86 self._write_endpoint = None |
87 self._interface_number = None | 87 self._interface_number = None |
88 self._max_read_packet_len = None | 88 self._max_read_packet_len = None |
89 | 89 |
90 @property | 90 @property |
91 def usb_info(self): | 91 def usb_info(self): |
92 try: | 92 try: |
93 sn = self.serial_number | 93 sn = self.serial_number |
94 except libusb1.USBError: | 94 except libusb1.USBError: |
95 sn = '' | 95 sn = '' |
96 if sn and sn != self._usb_info: | 96 if sn and sn != self._usb_info and self._usb_info: |
97 return '%s %s' % (self._usb_info, sn) | 97 return '%s %s' % (self._usb_info, sn) |
98 return self._usb_info | 98 return self._usb_info |
99 | 99 |
100 def Open(self): | 100 def Open(self): |
101 """Opens the USB device for this setting, and claims the interface.""" | 101 """Opens the USB device for this setting, and claims the interface.""" |
102 # Make sure we close any previous handle open to this usb device. | 102 # Make sure we close any previous handle open to this usb device. |
103 port_path = self.port_path | 103 port_path = self.port_path |
104 _LOG.info('%s.Open()', self.port_path_str) | 104 _LOG.info('%s.Open()', self.port_path_str) |
105 | 105 |
106 with self._HANDLE_CACHE_LOCK: | 106 with self._HANDLE_CACHE_LOCK: |
107 previous = self._HANDLE_CACHE.get(port_path) | 107 previous = self._HANDLE_CACHE.get(port_path) |
108 if previous: | 108 if previous: |
109 _LOG.error( | 109 _LOG.error( |
110 '%s.Open(): Found already opened port:\n%s', | 110 '%s.Open(): Found already opened port:\n%s', |
111 self.port_path_str, previous[1]) | 111 self.port_path_str, previous[1]) |
112 previous[0].Close() | 112 previous[0].Close() |
113 | 113 |
114 for endpoint in self._setting.iterEndpoints(): | 114 try: |
115 address = endpoint.getAddress() | 115 for endpoint in self._setting.iterEndpoints(): |
116 if address & libusb1.USB_ENDPOINT_DIR_MASK: | 116 address = endpoint.getAddress() |
117 self._read_endpoint = address | 117 if address & libusb1.USB_ENDPOINT_DIR_MASK: |
118 self._max_read_packet_len = endpoint.getMaxPacketSize() | 118 self._read_endpoint = address |
119 else: | 119 self._max_read_packet_len = endpoint.getMaxPacketSize() |
120 self._write_endpoint = address | 120 else: |
121 self._write_endpoint = address | |
121 | 122 |
122 assert self._read_endpoint is not None | 123 assert self._read_endpoint is not None |
123 assert self._write_endpoint is not None | 124 assert self._write_endpoint is not None |
124 | 125 |
125 handle = self._device.open() | 126 self._handle = self._device.open() |
126 iface_number = self._setting.getNumber() | 127 self._interface_number = self._setting.getNumber() |
127 try: | 128 try: |
128 if handle.kernelDriverActive(iface_number): | 129 if self._handle.kernelDriverActive(self._interface_number): |
129 handle.detachKernelDriver(iface_number) | 130 self._handle.detachKernelDriver(self._interface_number) |
130 except libusb1.USBError as e: | 131 except libusb1.USBError as e: |
131 if e.value == libusb1.LIBUSB_ERROR_NOT_FOUND: | 132 if e.value == libusb1.LIBUSB_ERROR_NOT_FOUND: |
132 _LOG.warning( | 133 _LOG.warning( |
133 '%s.Open(): Kernel driver not found for interface: %s.', | 134 '%s.Open(): Kernel driver not found for interface: %s.', |
134 self.port_path_str, iface_number) | 135 self.port_path_str, self._interface_number) |
135 else: | 136 self.Close() |
136 raise | 137 else: |
137 handle.claimInterface(iface_number) | 138 raise |
138 self._handle = handle | 139 self._handle.claimInterface(self._interface_number) |
139 self._interface_number = iface_number | |
140 | 140 |
141 stack = ''.join(traceback.format_stack()[:-2]) | 141 stack = ''.join(traceback.format_stack()[:-2]) |
142 with self._HANDLE_CACHE_LOCK: | 142 with self._HANDLE_CACHE_LOCK: |
143 self._HANDLE_CACHE[port_path] = (self._handle, stack) | 143 self._HANDLE_CACHE[port_path] = (self, stack) |
ghost stip (do not use)
2015/11/03 18:50:46
that seems wrong, wouldn't you still want to add t
M-A Ruel
2015/11/04 18:39:10
It's wrong too, I'll get rid of this once I figure
| |
144 except Exception as e: | |
145 self.Close() | |
146 raise | |
144 | 147 |
145 @property | 148 @property |
146 def is_open(self): | 149 def is_open(self): |
147 return bool(self._handle) | 150 return bool(self._handle) |
148 | 151 |
149 @property | 152 @property |
150 def serial_number(self): | 153 def serial_number(self): |
151 if not self._serial_number: | 154 if not self._serial_number: |
152 self._serial_number = self._device.getSerialNumber() | 155 self._serial_number = self._device.getSerialNumber() |
153 return self._serial_number | 156 return self._serial_number |
(...skipping 10 matching lines...) Expand all Loading... | |
164 return '/'.join(str(p) for p in self.port_path) | 167 return '/'.join(str(p) for p in self.port_path) |
165 | 168 |
166 def Close(self): | 169 def Close(self): |
167 port_path = self.port_path | 170 port_path = self.port_path |
168 _LOG.info('%s.Close()', self.port_path_str) | 171 _LOG.info('%s.Close()', self.port_path_str) |
169 with self._HANDLE_CACHE_LOCK: | 172 with self._HANDLE_CACHE_LOCK: |
170 self._HANDLE_CACHE.pop(port_path, None) | 173 self._HANDLE_CACHE.pop(port_path, None) |
171 if self._handle is None: | 174 if self._handle is None: |
172 return | 175 return |
173 try: | 176 try: |
174 self._handle.releaseInterface(self._interface_number) | 177 if self._interface_number: |
178 self._handle.releaseInterface(self._interface_number) | |
175 self._handle.close() | 179 self._handle.close() |
176 except libusb1.USBError as e: | 180 except libusb1.USBError as e: |
177 _LOG.info('%s.Close(): USBError: %s', self.port_path_str, e) | 181 _LOG.info('%s.Close(): USBError: %s', self.port_path_str, e) |
178 finally: | 182 finally: |
179 self._handle = None | 183 self._handle = None |
180 self._read_endpoint = None | 184 self._read_endpoint = None |
181 self._write_endpoint = None | 185 self._write_endpoint = None |
182 self._interface_number = None | 186 self._interface_number = None |
183 self._max_read_packet_len = None | 187 self._max_read_packet_len = None |
184 | 188 |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
356 return self._connection.sendall(data) | 360 return self._connection.sendall(data) |
357 | 361 |
358 def BulkRead(self, numbytes, timeout=None): # pylint: disable=unused-argument | 362 def BulkRead(self, numbytes, timeout=None): # pylint: disable=unused-argument |
359 return self._connection.recv(numbytes) | 363 return self._connection.recv(numbytes) |
360 | 364 |
361 def Timeout(self, timeout_ms): | 365 def Timeout(self, timeout_ms): |
362 return timeout_ms | 366 return timeout_ms |
363 | 367 |
364 def Close(self): | 368 def Close(self): |
365 return self._connection.close() | 369 return self._connection.close() |
OLD | NEW |