]> Repositories - Adafruit_Blinka-hackapet.git/blob - src/digitalio.py
f129c47faf7d4d524aae818c0f7ded2806337074
[Adafruit_Blinka-hackapet.git] / src / digitalio.py
1 """
2 `digitalio` - Digital input and output control
3 =================================================
4
5 See `CircuitPython:digitalio` in CircuitPython for more details.
6
7 * Author(s): cefn
8 """
9
10 from adafruit_blinka.agnostic import board_id, detector
11
12 # pylint: disable=ungrouped-imports,wrong-import-position
13
14 if detector.chip.BCM2XXX:
15     from adafruit_blinka.microcontroller.bcm283x.pin import Pin
16 elif detector.chip.AM33XX:
17     from adafruit_blinka.microcontroller.am335x.pin import Pin
18 elif detector.chip.SUN8I:
19     from adafruit_blinka.microcontroller.allwinner_h3.pin import Pin
20 elif detector.chip.SAMA5:
21     from adafruit_blinka.microcontroller.sama5.pin import Pin
22 elif detector.chip.T210:
23     if detector.board.JETSON_TX1:
24         from adafruit_blinka.microcontroller.tegra.t210.x1_pin import Pin
25     elif detector.board.JETSON_TXX:
26         from adafruit_blinka.microcontroller.tegra.t210.xx_pin import Pin
27 elif detector.chip.T186:
28     from adafruit_blinka.microcontroller.tegra.t186.pin import Pin
29 elif detector.chip.T194:
30     from adafruit_blinka.microcontroller.tegra.t194.pin import Pin
31 elif detector.chip.STM32:
32     from machine import Pin
33 from adafruit_blinka import Enum, ContextManaged
34
35 class DriveMode(Enum):
36     PUSH_PULL = None
37     OPEN_DRAIN = None
38
39
40 DriveMode.PUSH_PULL = DriveMode()
41 DriveMode.OPEN_DRAIN = DriveMode()
42
43
44 class Direction(Enum):
45     INPUT = None
46     OUTPUT = None
47
48
49 Direction.INPUT = Direction()
50 Direction.OUTPUT = Direction()
51
52
53 class Pull(Enum):
54     UP = None
55     DOWN = None
56     #NONE=None
57
58
59 Pull.UP = Pull()
60 Pull.DOWN = Pull()
61
62 #Pull.NONE = Pull()
63
64
65 class DigitalInOut(ContextManaged):
66     _pin = None
67
68     def __init__(self, pin):
69         self._pin = Pin(pin.id)
70         self.direction = Direction.INPUT
71
72     def switch_to_output(self, value=False, drive_mode=DriveMode.PUSH_PULL):
73         self.direction = Direction.OUTPUT
74         self.value = value
75         self.drive_mode = drive_mode
76
77     def switch_to_input(self, pull=None):
78         self.direction = Direction.INPUT
79         self.pull = pull
80
81     def deinit(self):
82         del self._pin
83
84     @property
85     def direction(self):
86         return self.__direction
87
88     @direction.setter
89     def direction(self, dir):
90         self.__direction = dir
91         if dir is Direction.OUTPUT:
92             self._pin.init(mode=Pin.OUT)
93             self.value = False
94             self.drive_mode = DriveMode.PUSH_PULL
95         elif dir is Direction.INPUT:
96             self._pin.init(mode=Pin.IN)
97             self.pull = None
98         else:
99             raise AttributeError("Not a Direction")
100
101     @property
102     def value(self):
103         return self._pin.value() is 1
104
105     @value.setter
106     def value(self, val):
107         if self.direction is Direction.OUTPUT:
108             self._pin.value(1 if val else 0)
109         else:
110             raise AttributeError("Not an output")
111
112     @property
113     def pull(self):
114         if self.direction is Direction.INPUT:
115             return self.__pull
116         else:
117             raise AttributeError("Not an input")
118
119     @pull.setter
120     def pull(self, pul):
121         if self.direction is Direction.INPUT:
122             self.__pull = pul
123             if pul is Pull.UP:
124                 self._pin.init(mode=Pin.IN, pull=Pin.PULL_UP)
125             elif pul is Pull.DOWN:
126                 if hasattr(Pin, "PULL_DOWN"):
127                     self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN)
128                 else:
129                     raise NotImplementedError("{} unsupported on {}".format(
130                         Pull.DOWN, board_id))
131             elif pul is None:
132                 self._pin.init(mode=Pin.IN, pull=None)
133             else:
134                 raise AttributeError("Not a Pull")
135         else:
136             raise AttributeError("Not an input")
137
138     @property
139     def drive_mode(self):
140         if self.direction is Direction.OUTPUT:
141             return self.__drive_mode  #
142         else:
143             raise AttributeError("Not an output")
144
145     @drive_mode.setter
146     def drive_mode(self, mod):
147         self.__drive_mode = mod
148         if mod is DriveMode.OPEN_DRAIN:
149             self._pin.init(mode=Pin.OPEN_DRAIN)
150         elif mod is DriveMode.PUSH_PULL:
151             self._pin.init(mode=Pin.OUT)