+import machine
+from mcp import Enum
+
+class DriveMode(Enum):
+ pass
+DriveMode.PUSH_PULL=DriveMode()
+DriveMode.OPEN_DRAIN=DriveMode()
+
+class Direction(Enum):
+ pass
+Direction.INPUT = Direction()
+Direction.OUTPUT = Direction()
+
+class Pull(Enum):
+ pass
+Pull.UP = Pull()
+Pull.DOWN = Pull()
+
+class DigitalInOut:
+ _pin=None
+ def __init__(self, pin):
+ self.pin = pin
+ self._pin = None
+ self.switch_to_input()
+ pass
+
+ def deinit(self):
+ del self._pin
+
+ def __enter__(self):
+ pass
+
+ def __exit__(self):
+ self.deinit()
+
+ def __setattr__(self, key, val):
+ if self._pin is not None:
+ mode = self._pin.mode()
+ if key == "value":
+ if mode is machine.Pin.INPUT:
+ raise AttributeError("Pin is output")
+ self._pin.value(val)
+ elif key == "direction":
+ if val is Direction.OUTPUT:
+ self._pin.mode(machine.Pin.OUT)
+ elif val is Direction.INPUT:
+ self._pin.mode(machine.Pin.IN)
+
+ else:
+ raise ValueError("Deinitialised")
+
+ def __getattr__(self, key):
+ if self._pin is not None:
+ mode = self._pin.mode()
+ if key=="value:":
+ if mode is machine.Pin.OUTPUT:
+ raise AttributeError("Pin is output")
+ return self._pin.value()
+ elif key == "drive_mode":
+ if mode is machine.Pin.OPEN_DRAIN:
+ return DriveMode.OPEN_DRAIN
+ elif mode is machine.Pin.OUT:
+ return DriveMode.PUSH_PULL
+ elif mode is machine.Pin.IN:
+ raise AttributeError("Pin is input")
+ elif key=="direction":
+ mode = self._pin.mode()
+ if mode is machine.Pin.IN:
+ return Direction.INPUT
+ elif mode is machine.Pin.OUT:
+ return Direction.OUTPUT
+ elif mode is machine.Pin.OPEN_DRAIN:
+ return Direction.OUTPUT
+ elif key=="pull":
+ if mode is machine.Pin.OUTPUT:
+ raise AttributeError("Pin is output")
+ pull = self._pin.pull()
+ if pull is machine.Pin.PULL_UP:
+ return Pull.UP
+ elif pull is machine.Pin.PULL_DOWN:
+ return Pull.DOWN
+ elif pull is None:
+ return None
+ else:
+ raise ValueError("Deinitialised")
+
+
+ def switch_to_output(self, value=False, drive_mode=DriveMode.PUSH_PULL):
+ self._pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)
+ pass
+
+ def switch_to_input(self, pull=None):
+ self._pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)
+ pass
+
+ def direction(self, *a):
+ pass
+
+ def value(self, *a):
+ pass
+
+ def drive_mode(self, *a):
+ pass
+
+ def pull(self, *a):
+ pass
+
+__all__ = ['DigitalInOut', 'DriveMode', 'Direction','Pull']
\ No newline at end of file