50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
class PCF8574:
|
|
def __init__(self, i2c, addr=0x20):
|
|
self._i2c = i2c
|
|
i2cModules = self._i2c.scan()
|
|
if addr not in i2cModules:
|
|
error = "Unable to find module 'PCF8574' at address " + str(hex(addr)) + ". Please check connections with the board.\n"
|
|
error += "[Info] I2C address.es detected: " + str([hex(a) for a in i2cModules])
|
|
raise ValueError(error)
|
|
self._addr = addr
|
|
self._port = bytearray(1)
|
|
|
|
@property
|
|
def port(self):
|
|
self._read()
|
|
return self._port[0]
|
|
|
|
@port.setter
|
|
def port(self, value):
|
|
self._port[0] = value & 0xff
|
|
self._write()
|
|
|
|
def pin(self, pin, value=None):
|
|
pin = self.validate_pin(pin)
|
|
if value is None:
|
|
self._read()
|
|
return (self._port[0] >> pin) & 1
|
|
else:
|
|
if value:
|
|
self._port[0] |= (1 << (pin))
|
|
else:
|
|
self._port[0] &= ~(1 << (pin))
|
|
self._write()
|
|
|
|
def toggle(self, pin):
|
|
pin = self.validate_pin(pin)
|
|
self._port[0] ^= (1 << (pin))
|
|
self._write()
|
|
|
|
def validate_pin(self, pin):
|
|
# pin valid range 0..7
|
|
if not 0 <= pin <= 7:
|
|
raise ValueError('Invalid pin {}. Use 0-7.'.format(pin))
|
|
return pin
|
|
|
|
def _read(self):
|
|
self._i2c.readfrom_into(self._addr, self._port)
|
|
|
|
def _write(self):
|
|
self._i2c.writeto(self._addr, self._port)
|