X-Git-Url: https://git.ayoreis.com/Adafruit_Blinka-hackapet.git/blobdiff_plain/15891fa3df5ef5bc97c020fc72c34dc43348b253..9de26f1535a5cce11156afd3816c00758cf03a38:/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py diff --git a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py index db9007a..831bc1a 100644 --- a/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py +++ b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py @@ -1,90 +1,22 @@ +# SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT """A Pin class for use with libgpiod.""" try: import gpiod except ImportError: raise ImportError( "libgpiod Python bindings not found, please install and try again! See " - "https://github.com/adafruit/Raspberry-Pi-Installer-Scripts/blob/master/libgpiod.sh" + "https://github.com/adafruit/Raspberry-Pi-Installer-Scripts/blob/main/libgpiod.py" ) from ImportError +# Versions 1.5.4 and earlier have no __version__ attribute +if hasattr(gpiod, "__version__"): + version = gpiod.__version__ +else: + version = "1.x" -class Pin: - """Pins dont exist in CPython so...lets make our own!""" - - IN = 0 - OUT = 1 - LOW = 0 - HIGH = 1 - PULL_NONE = 0 - PULL_UP = 1 - PULL_DOWN = 2 - _CONSUMER = "adafruit_blinka" - - id = None - _value = LOW - _mode = IN - - def __init__(self, pin_id): - self.id = pin_id - if isinstance(pin_id, tuple): - self._num = int(pin_id[1]) - self._chip = gpiod.Chip(str(pin_id[0]), gpiod.Chip.OPEN_BY_NUMBER) - else: - self._num = int(pin_id) - self._chip = gpiod.Chip("gpiochip0", gpiod.Chip.OPEN_BY_NAME) - self._line = None - - def __repr__(self): - return str(self.id) - - def __eq__(self, other): - return self.id == other - - def init(self, mode=IN, pull=None): - """Initialize the Pin""" - if not self._line: - self._line = self._chip.get_line(int(self._num)) - # print("init line: ", self.id, self._line) - - if mode is not None: - if mode == self.IN: - flags = 0 - if pull is not None: - if pull == self.PULL_UP: - raise NotImplementedError( - "Internal pullups not supported in libgpiod, " - "use physical resistor instead!" - ) - if pull == self.PULL_DOWN: - raise NotImplementedError( - "Internal pulldowns not supported in libgpiod, " - "use physical resistor instead!" - ) - raise RuntimeError("Invalid pull for pin: %s" % self.id) - - self._mode = self.IN - self._line.release() - self._line.request( - consumer=self._CONSUMER, type=gpiod.LINE_REQ_DIR_IN, flags=flags - ) - - elif mode == self.OUT: - if pull is not None: - raise RuntimeError("Cannot set pull resistor on output") - self._mode = self.OUT - self._line.release() - self._line.request(consumer=self._CONSUMER, type=gpiod.LINE_REQ_DIR_OUT) - - else: - raise RuntimeError("Invalid mode for pin: %s" % self.id) - - def value(self, val=None): - """Set or return the Pin Value""" - if val is None: - return self._line.get_value() - - if val in (self.LOW, self.HIGH): - self._value = val - self._line.set_value(val) - return None - raise RuntimeError("Invalid value for pin") +if version.startswith("1."): + from .libgpiod.libgpiod_pin_1_x import Pin # pylint: disable=unused-import +else: + from .libgpiod.libgpiod_pin_2_x import Pin # pylint: disable=unused-import