2 `digitalio` - Digital input and output control
3 =================================================
5 See `CircuitPython:digitalio` in CircuitPython for more details.
10 from adafruit_blinka.agnostic import board as boardId
11 if boardId == "raspi_3" or boardId == "raspi_2":
12 from adafruit_blinka.microcontroller.raspi_23.pin import Pin
14 from machine import Pin
15 from adafruit_blinka import Enum, ContextManaged
17 class DriveMode(Enum):
22 DriveMode.PUSH_PULL = DriveMode()
23 DriveMode.OPEN_DRAIN = DriveMode()
26 class Direction(Enum):
31 Direction.INPUT = Direction()
32 Direction.OUTPUT = Direction()
47 class DigitalInOut(ContextManaged):
50 def __init__(self, pin):
51 self._pin = Pin(pin.id)
52 self.direction = Direction.INPUT
54 def switch_to_output(self, value=False, drive_mode=DriveMode.PUSH_PULL):
55 self.direction = Direction.OUTPUT
57 self.drive_mode = drive_mode
59 def switch_to_input(self, pull=None):
60 self.direction = Direction.INPUT
68 return self.__direction
71 def direction(self, dir):
72 self.__direction = dir
73 if dir is Direction.OUTPUT:
74 self._pin.init(mode=Pin.OUT)
76 self.drive_mode = DriveMode.PUSH_PULL
77 elif dir is Direction.INPUT:
78 self._pin.init(mode=Pin.IN)
81 raise AttributeError("Not a Direction")
85 return self._pin.value() is 1
89 if self.direction is Direction.OUTPUT:
90 self._pin.value(1 if val else 0)
92 raise AttributeError("Not an output")
96 if self.direction is Direction.INPUT:
99 raise AttributeError("Not an input")
103 if self.direction is Direction.INPUT:
106 self._pin.init(mode=Pin.IN, pull=Pin.PULL_UP)
107 elif pul is Pull.DOWN:
108 if hasattr(Pin, "PULL_DOWN"):
109 self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN)
111 raise NotImplementedError("{} unsupported on {}".format(
114 self._pin.init(mode=Pin.IN, pull=None)
116 raise AttributeError("Not a Pull")
118 raise AttributeError("Not an input")
121 def drive_mode(self):
122 if self.direction is Direction.OUTPUT:
123 return self.__drive_mode #
125 raise AttributeError("Not an output")
128 def drive_mode(self, mod):
129 self.__drive_mode = mod
130 if mod is DriveMode.OPEN_DRAIN:
131 self._pin.init(mode=Pin.OPEN_DRAIN)
132 elif mod is DriveMode.PUSH_PULL:
133 self._pin.init(mode=Pin.OUT)