1 # SPDX-FileCopyrightText: 2021 Melissa LeBlanc-Williams for Adafruit Industries
3 # SPDX-License-Identifier: MIT
4 """A Pin class for use with libgpiod 2.x."""
8 # pylint: disable=too-many-branches,too-many-statements
10 """Pins dont exist in CPython so...lets make our own!"""
19 _CONSUMER = "adafruit_blinka"
25 _value_map = (gpiod.line.Value.INACTIVE, gpiod.line.Value.ACTIVE)
27 def __init__(self, pin_id):
30 if isinstance(pin_id, tuple):
31 chip_id, self._num = pin_id
32 if isinstance(chip_id, int):
33 chip_id = f"/dev/gpiochip{chip_id}"
34 self._chip = gpiod.Chip(chip_id)
35 self._line_request = None
38 if self._line_request:
39 self._line_request.release()
44 def __eq__(self, other):
45 return self.id == other
47 def init(self, mode=IN, pull=None):
48 """Initialize the Pin"""
50 if not self._line_request:
51 self._line_request = self._chip.request_lines(
52 config={int(self._num): None},
53 consumer=self._CONSUMER,
55 # print("init line: ", self.id, self._line)
58 line_config = gpiod.LineSettings()
60 line_config.direction = gpiod.line.Direction.INPUT
62 if pull == self.PULL_UP:
63 line_config.bias = gpiod.line.Bias.PULL_UP
64 elif pull == self.PULL_DOWN:
65 line_config.bias = gpiod.line.Bias.PULL_DOWN
66 elif pull == self.PULL_NONE:
67 line_config.bias = gpiod.line.Bias.DISABLED
69 raise RuntimeError(f"Invalid pull for pin: {self.id}")
72 self._line_request.reconfigure_lines(
74 int(self._num): line_config,
77 elif mode == self.OUT:
79 raise RuntimeError("Cannot set pull resistor on output")
81 line_config.direction = gpiod.line.Direction.OUTPUT
82 self._line_request.reconfigure_lines(
84 int(self._num): line_config,
88 raise RuntimeError("Invalid mode for pin: %s" % self.id)
90 def value(self, val=None):
91 """Set or return the Pin Value"""
93 return bool(self._value_map.index(self._line_request.get_value(self._num)))
95 if val in (self.LOW, self.HIGH):
97 self._line_request.set_value(self._num, self._value_map[int(val)])
99 raise RuntimeError("Invalid value for pin")