from machine import Pin 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() Pull.NONE = Pull() class DigitalInOut(object): _pin = None def __init__(self, pin): self._pin = Pin(pin.id) self.direction = Direction.INPUT def switch_to_output(self, value=False, drive_mode=DriveMode.PUSH_PULL): self.direction=Direction.OUTPUT self.value=value self.drive_mode=drive_mode def switch_to_input(self, pull=None): self.direction=Direction.INPUT self.pull=pull def deinit(self): del self._pin def __enter__(self): pass def __exit__(self): self.deinit() @property def direction(self): return self.__direction @direction.setter def direction(self, dir): self.__direction = dir if dir is Direction.OUTPUT: self._pin.init(mode=Pin.OUT) self.value = False self.drive_mode = DriveMode.PUSH_PULL elif dir is Direction.INPUT: self._pin.init(mode=Pin.IN) self.pull = None else: raise AttributeError("Not a Direction") @property def value(self): return self._pin.value() @value.setter def value(self, val): if self.direction is Direction.OUTPUT: self._pin.value(val) else: raise AttributeError("Not an output") @property def pull(self): if self.direction is Direction.INPUT: return self.__pull else: raise AttributeError("Not an input") # @pull.setter def pull(self, pul): if self.direction is Direction.INPUT: self.__pull = pul if pul is Pull.UP: self._pin.init(mode=Pin.IN, pull=Pin.PULL_UP) elif pul is Pull.DOWN: self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN) elif pul is None: self._pin.init(mode=Pin.IN, pull=None) else: raise AttributeError("Not a Pull")# else: raise AttributeError("Not an input") # @property def drive_mode(self): if self.direction is Direction.OUTPUT: return self.__drive_mode# else: raise AttributeError("Not an output") @drive_mode.setter def drive_mode(self, mod): self.__drive_mode = mod if mod is DriveMode.OPEN_DRAIN: self._pin.init(mode=Pin.OPEN_DRAIN) elif mod is DriveMode.PUSH_PULL: self._pin.init(mode=Pin.OUT) # __all__ = ['DigitalInOut', 'DriveMode', 'Direction','Pull']