X-Git-Url: https://git.ayoreis.com/hackapet/Adafruit_Blinka.git/blobdiff_plain/981fa23676c3b98fefab8efe78a8b4cf17723369..031c39f2511a2db0913d6f0410056e3b71c47cc5:/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 new file mode 100644 index 0000000..51b87f9 --- /dev/null +++ b/src/adafruit_blinka/microcontroller/generic_linux/libgpiod_pin.py @@ -0,0 +1,74 @@ +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") + +# Pins dont exist in CPython so...lets make our own! +class Pin: + 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_number, gpiod_chipname="gpiochip0"): + self.id = int(pin_number) + # FIXME: Presumably this might vary by system: + self._chip = gpiod.Chip(gpiod_chipname, 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): + if not self._line: + self._line = self._chip.get_line(int(self.id)) + print("init line: ", int(self.id), self._line) + + if mode != None: + if mode == self.IN: + flags = 0 + if pull != None: + if pull == self.PULL_UP: + flags |= gpiod.LINE_REQ_FLAG_ACTIVE_LOW + elif pull == self.PULL_DOWN: + flags |= gpiod.LINE_REQ_FLAG_ACTIVE_HIGH + else: + 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 != 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): + if val != None: + if val in (self.LOW, self.HIGH): + self._value = val + self._line.set_value(val) + else: + raise RuntimeError("Invalid value for pin") + else: + return self._line.get_value()