from machine import Pin
|
|
from adafruit_blinka.agnostic import board as boardId
|
|
from adafruit_blinka import Enum, ContextManaged
|
|
|
|
|
|
class DriveMode(Enum):
|
|
PUSH_PULL = None
|
|
OPEN_DRAIN = None
|
|
|
|
|
|
DriveMode.PUSH_PULL = DriveMode()
|
|
DriveMode.OPEN_DRAIN = DriveMode()
|
|
|
|
|
|
class Direction(Enum):
|
|
INPUT = None
|
|
OUTPUT = None
|
|
|
|
|
|
Direction.INPUT = Direction()
|
|
Direction.OUTPUT = Direction()
|
|
|
|
|
|
class Pull(Enum):
|
|
UP = None
|
|
DOWN = None
|
|
#NONE=None
|
|
|
|
|
|
Pull.UP = Pull()
|
|
Pull.DOWN = Pull()
|
|
|
|
#Pull.NONE = Pull()
|
|
|
|
|
|
class DigitalInOut(ContextManaged):
|
|
_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
|
|
|
|
@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() is 1
|
|
|
|
@value.setter
|
|
def value(self, val):
|
|
if self.direction is Direction.OUTPUT:
|
|
self._pin.value(1 if val else 0)
|
|
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:
|
|
if hasattr(Pin, "PULL_DOWN"):
|
|
self._pin.init(mode=Pin.IN, pull=Pin.PULL_DOWN)
|
|
else:
|
|
raise NotImplementedError("{} unsupported on {}".format(
|
|
Pull.DOWN, boardId))
|
|
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)
|