+"""FT232H pin names"""
+
+
class Pin:
"""A basic Pin class for use with FT232H."""
OUT = 1
LOW = 0
HIGH = 1
+ PULL_NONE = 0
+ PULL_UP = 1
+ PULL_DOWN = 2
ft232h_gpio = None
# setup GPIO controller if not done yet
# use one provided by I2C as default
if not Pin.ft232h_gpio:
+ # pylint: disable=import-outside-toplevel
from pyftdi.i2c import I2cController
+
+ # pylint: enable=import-outside-toplevel
+
i2c = I2cController()
- i2c.configure("ftdi:///1")
+ i2c.configure("ftdi://ftdi:ft232h/1")
Pin.ft232h_gpio = i2c.get_gpio()
# check if pin is valid
if pin_id:
self.id = pin_id
def init(self, mode=IN, pull=None):
+ """Initialize the Pin"""
if not self.id:
raise RuntimeError("Can not init a None type pin.")
# FT232H does't have configurable internal pulls?
if pull:
- raise ValueError("Internal pull up/down not currently supported.")
+ raise NotImplementedError("Internal pull up/down not currently supported.")
pin_mask = Pin.ft232h_gpio.pins | 1 << self.id
current = Pin.ft232h_gpio.direction
if mode == self.OUT:
Pin.ft232h_gpio.set_direction(pin_mask, current)
def value(self, val=None):
+ """Set or return the Pin Value"""
if not self.id:
raise RuntimeError("Can not access a None type pin.")
current = Pin.ft232h_gpio.read(with_output=True)
if val is None:
return 1 if current & 1 << self.id != 0 else 0
# write
- elif val in (self.LOW, self.HIGH):
+ if val in (self.LOW, self.HIGH):
if val == self.HIGH:
current |= 1 << self.id
else:
current &= ~(1 << self.id)
+ # must mask out any input pins
Pin.ft232h_gpio.write(current & Pin.ft232h_gpio.direction)
+ return None
# release the kraken
- else:
- raise RuntimeError("Invalid value for pin")
+ raise RuntimeError("Invalid value for pin")
+
# create pin instances for each pin
# D0 to D3 are used by I2C/SPI
SDA = Pin()
SCK = SCLK = Pin()
MOSI = Pin()
-MISO = Pin()
\ No newline at end of file
+MISO = Pin()