1 from machine import Pin
2 from adafruit_blinka.agnostic import board as boardId
3 from adafruit_blinka import Enum, ContextManaged
11 DriveMode.PUSH_PULL = DriveMode()
12 DriveMode.OPEN_DRAIN = DriveMode()
15 class Direction(Enum):
20 Direction.INPUT = Direction()
21 Direction.OUTPUT = Direction()
36 class DigitalInOut(ContextManaged):
39 def __init__(self, pin):
40 self._pin = Pin(pin.id)
41 self.direction = Direction.INPUT
43 def switch_to_output(self, value=False, drive_mode=DriveMode.PUSH_PULL):
44 self.direction = Direction.OUTPUT
46 self.drive_mode = drive_mode
48 def switch_to_input(self, pull=None):
49 self.direction = Direction.INPUT
57 return self.__direction
60 def direction(self, dir):
61 self.__direction = dir
62 if dir is Direction.OUTPUT:
63 self._pin.init(mode=Pin.OUT)
65 self.drive_mode = DriveMode.PUSH_PULL
66 elif dir is Direction.INPUT:
67 self._pin.init(mode=Pin.IN)
70 raise AttributeError("Not a Direction")
74 return self._pin.value() is 1
78 if self.direction is Direction.OUTPUT:
79 self._pin.value(1 if val else 0)
81 raise AttributeError("Not an output")
85 if self.direction is Direction.INPUT:
88 raise AttributeError("Not an input")
92 if self.direction is Direction.INPUT:
95 self._pin.init(mode=Pin.IN, pull=Pin.PULL_UP)
96 elif pul is Pull.DOWN:
97 if hasattr(Pin, "PULL_DOWN"):
98 self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN)
100 raise NotImplementedError("{} unsupported on {}".format(
103 self._pin.init(mode=Pin.IN, pull=None)
105 raise AttributeError("Not a Pull")
107 raise AttributeError("Not an input")
110 def drive_mode(self):
111 if self.direction is Direction.OUTPUT:
112 return self.__drive_mode #
114 raise AttributeError("Not an output")
117 def drive_mode(self, mod):
118 self.__drive_mode = mod
119 if mod is DriveMode.OPEN_DRAIN:
120 self._pin.init(mode=Pin.OPEN_DRAIN)
121 elif mod is DriveMode.PUSH_PULL:
122 self._pin.init(mode=Pin.OUT)
125 # __all__ = ['DigitalInOut', 'DriveMode', 'Direction','Pull']