1 from machine import Pin
2 from adafruit_blinka.agnostic import board as boardId
3 from adafruit_blinka import Enum,ContextManaged
9 DriveMode.PUSH_PULL = DriveMode()
10 DriveMode.OPEN_DRAIN = DriveMode()
13 class Direction(Enum):
16 Direction.INPUT = Direction()
17 Direction.OUTPUT = Direction()
29 class DigitalInOut(ContextManaged):
32 def __init__(self, pin):
33 self._pin = Pin(pin.id)
34 self.direction = Direction.INPUT
36 def switch_to_output(self, value=False, drive_mode=DriveMode.PUSH_PULL):
37 self.direction = Direction.OUTPUT
39 self.drive_mode = drive_mode
41 def switch_to_input(self, pull=None):
42 self.direction = Direction.INPUT
50 return self.__direction
53 def direction(self, dir):
54 self.__direction = dir
55 if dir is Direction.OUTPUT:
56 self._pin.init(mode=Pin.OUT)
58 self.drive_mode = DriveMode.PUSH_PULL
59 elif dir is Direction.INPUT:
60 self._pin.init(mode=Pin.IN)
63 raise AttributeError("Not a Direction")
67 return self._pin.value() is 1
71 if self.direction is Direction.OUTPUT:
72 self._pin.value(1 if val else 0)
74 raise AttributeError("Not an output")
78 if self.direction is Direction.INPUT:
81 raise AttributeError("Not an input")
85 if self.direction is Direction.INPUT:
88 self._pin.init(mode=Pin.IN, pull=Pin.PULL_UP)
89 elif pul is Pull.DOWN:
90 if hasattr(Pin, "PULL_DOWN"):
91 self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN)
93 raise NotImplementedError("{} unsupported on {}".format(Pull.DOWN, boardId))
95 self._pin.init(mode=Pin.IN, pull=None)
97 raise AttributeError("Not a Pull")
99 raise AttributeError("Not an input")
102 def drive_mode(self):
103 if self.direction is Direction.OUTPUT:
104 return self.__drive_mode #
106 raise AttributeError("Not an output")
109 def drive_mode(self, mod):
110 self.__drive_mode = mod
111 if mod is DriveMode.OPEN_DRAIN:
112 self._pin.init(mode=Pin.OPEN_DRAIN)
113 elif mod is DriveMode.PUSH_PULL:
114 self._pin.init(mode=Pin.OUT)
116 # __all__ = ['DigitalInOut', 'DriveMode', 'Direction','Pull']