]> Repositories - Adafruit_Blinka-hackapet.git/commitdiff
Close the mcp2221 device before exit.
authorEzio Melotti <ezio.melotti@gmail.com>
Thu, 6 Jan 2022 16:29:47 +0000 (17:29 +0100)
committerEzio Melotti <ezio.melotti@gmail.com>
Thu, 6 Jan 2022 16:29:47 +0000 (17:29 +0100)
src/adafruit_blinka/microcontroller/mcp2221/mcp2221.py

index fb9edf3e9e788fbc8f139a8fd8ef421433b36a9a..fb8193cc87ba9e518e573b744a71b6ecf8a382ef 100644 (file)
@@ -2,6 +2,7 @@
 
 import os
 import time
 
 import os
 import time
+import atexit
 import hid
 
 # Here if you need it
 import hid
 
 # Here if you need it
@@ -51,13 +52,30 @@ class MCP2221:
     def __init__(self):
         self._hid = hid.device()
         self._hid.open(MCP2221.VID, MCP2221.PID)
     def __init__(self):
         self._hid = hid.device()
         self._hid.open(MCP2221.VID, MCP2221.PID)
+        # make sure the device gets closed before exit
+        atexit.register(self.close)
         if MCP2221_RESET_DELAY >= 0:
         if MCP2221_RESET_DELAY >= 0:
-            self._reset()
+            try:
+                self._reset()
+            except OSError:
+                # this might fail on Linux with the hid_mcp2221 native
+                # driver and a short reset delay -- if it fails,
+                # close the device before reraising
+                self.close()
+                raise
         self._gp_config = [0x07] * 4  # "don't care" initial value
         for pin in range(4):
             self.gp_set_mode(pin, self.GP_GPIO)  # set to GPIO mode
             self.gpio_set_direction(pin, 1)  # set to INPUT
 
         self._gp_config = [0x07] * 4  # "don't care" initial value
         for pin in range(4):
             self.gp_set_mode(pin, self.GP_GPIO)  # set to GPIO mode
             self.gpio_set_direction(pin, 1)  # set to INPUT
 
+    def close(self):
+        """Close the device. Does nothing if the device is not open."""
+        self._hid.close()
+
+    def __del__(self):
+        # try to close the device before destroying the instance
+        self.close()
+
     def _hid_xfer(self, report, response=True):
         """Perform HID Transfer"""
         # first byte is report ID, which =0 for MCP2221
     def _hid_xfer(self, report, response=True):
         """Perform HID Transfer"""
         # first byte is report ID, which =0 for MCP2221