2 `digitalio` - Digital input and output control
3 =================================================
5 See `CircuitPython:digitalio` in CircuitPython for more details.
10 from adafruit_blinka.agnostic import board_id, detector
12 # pylint: disable=ungrouped-imports,wrong-import-position
14 if detector.board.any_raspberry_pi_2_or_3:
15 from adafruit_blinka.microcontroller.bcm283x.pin import Pin
16 elif detector.board.BEAGLEBONE_BLACK:
17 from adafruit_blinka.microcontroller.am335x.pin import Pin
18 elif detector.board.ORANGE_PI_PC:
19 from adafruit_blinka.microcontroller.allwinner_h3.pin import Pin
20 elif detector.board.PYBOARD:
21 from machine import Pin
22 from adafruit_blinka import Enum, ContextManaged
24 class DriveMode(Enum):
29 DriveMode.PUSH_PULL = DriveMode()
30 DriveMode.OPEN_DRAIN = DriveMode()
33 class Direction(Enum):
38 Direction.INPUT = Direction()
39 Direction.OUTPUT = Direction()
54 class DigitalInOut(ContextManaged):
57 def __init__(self, pin):
58 self._pin = Pin(pin.id)
59 self.direction = Direction.INPUT
61 def switch_to_output(self, value=False, drive_mode=DriveMode.PUSH_PULL):
62 self.direction = Direction.OUTPUT
64 self.drive_mode = drive_mode
66 def switch_to_input(self, pull=None):
67 self.direction = Direction.INPUT
75 return self.__direction
78 def direction(self, dir):
79 self.__direction = dir
80 if dir is Direction.OUTPUT:
81 self._pin.init(mode=Pin.OUT)
83 self.drive_mode = DriveMode.PUSH_PULL
84 elif dir is Direction.INPUT:
85 self._pin.init(mode=Pin.IN)
88 raise AttributeError("Not a Direction")
92 return self._pin.value() is 1
96 if self.direction is Direction.OUTPUT:
97 self._pin.value(1 if val else 0)
99 raise AttributeError("Not an output")
103 if self.direction is Direction.INPUT:
106 raise AttributeError("Not an input")
110 if self.direction is Direction.INPUT:
113 self._pin.init(mode=Pin.IN, pull=Pin.PULL_UP)
114 elif pul is Pull.DOWN:
115 if hasattr(Pin, "PULL_DOWN"):
116 self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN)
118 raise NotImplementedError("{} unsupported on {}".format(
119 Pull.DOWN, board_id))
121 self._pin.init(mode=Pin.IN, pull=None)
123 raise AttributeError("Not a Pull")
125 raise AttributeError("Not an input")
128 def drive_mode(self):
129 if self.direction is Direction.OUTPUT:
130 return self.__drive_mode #
132 raise AttributeError("Not an output")
135 def drive_mode(self, mod):
136 self.__drive_mode = mod
137 if mod is DriveMode.OPEN_DRAIN:
138 self._pin.init(mode=Pin.OPEN_DRAIN)
139 elif mod is DriveMode.PUSH_PULL:
140 self._pin.init(mode=Pin.OUT)