Code: Select all
#!/usr/bin/python
# (C) 2017, 2018 Copyright Darkside Logic (One) Ltd. All rights reserved
# Version 0.9.3
import smbus
import syslog
class pinControl():
def __init__(self, addr = 0x27, active='HIGH', aDir = 0x00, bDir = 0x00):
self.ADDR = addr
self.active = (True if active == 'HIGH' else False)
self.IODIRA = 0x00
self.IODIRB = 0x01
self.IPOLA = 0x02
self.IPOLB = 0x03
self.GPINTENA = 0x04
self.GPINTENB = 0x05
self.DEFVALA = 0x06
self.DEFVALB = 0x07
self.INTCONA = 0x08
self.INTCONB = 0x09
self.IOCON1 = 0x0A
self.IOCON2 = 0x0B
self.GPPUA = 0x0C
self.GPPUB = 0x0D
self.INTFA = 0x0E
self.INTFB = 0x0F
self.INTCAPA = 0x10
self.INTCAPB = 0x11
self.GPIOA = 0x12
self.GPIOB = 0x13
self.OLATA = 0x14
self.OLATB = 0x15
self.bus=smbus.SMBus(1)
self.valueA = 0
self.valueB = 0
self.ipolA = 0
self.ipolB = 0
self.gpintenA = 0
self.gpintenB = 0
self.defvalA = 0
self.defvalB = 0
self.intconA = 0
self.intconB = 0
self.gppuA = 0
self.gppuB = 0
try:
self.bus.write_byte_data(self.ADDR,self.IODIRA,aDir)
self.bus.write_byte_data(self.ADDR,self.IODIRB,bDir)
self.chipOK = True
except:
self.chipOK = False
def pinOn(self, bank, pin):
if self.chipOK:
# print (bank, pin, "On")
bit = pin - 1
if bank == 'B':
if self.active:
self.valueB = self.valueB | (1 << bit)
else:
self.valueB = self.valueB & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.OLATB, self.valueB)
else:
if self.active:
self.valueA = self.valueA | (1 << bit)
else:
self.valueA = self.valueA & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.OLATA, self.valueA)
def pinOff(self, bank, pin):
if self.chipOK:
# print (bank, pin, "Off")
bit = pin - 1
if bank == 'B':
if self.active:
self.valueB = self.valueB & (0xff - (1 << bit))
else:
self.valueB = self.valueB | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.OLATB, self.valueB)
else:
if self.active:
self.valueA = self.valueA & (0xff - (1 << bit))
else:
self.valueA = self.valueA | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.OLATA, self.valueA)
def pinAllOff(self):
if self.chipOK:
# print "All off called"
if self.active:
self.valueA = 0x00
else:
self.valueA = 0xFF
self.bus.write_byte_data(self.ADDR, self.OLATA, self.valueA)
if self.active:
self.valueB = 0x00
else:
self.valueB = 0xFF
self.bus.write_byte_data(self.ADDR, self.OLATB, self.valueB)
def pinRead(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
busVal = self.bus.read_byte_data(self.ADDR, self.GPIOB)
self.valueB = busVal
state = ((busVal & (1 << bit)) != 0)
else:
busVal = self.bus.read_byte_data(self.ADDR, self.GPIOA)
self.valueA = busVal
state = ((busVal & ( 1<< bit)) != 0)
return "pinRead Bank:", bank, " Pin:", pin, state
else:
return None
def readIOCON(self):
if self.chipOK:
busVal1 = self.bus.read_byte_data(self.ADDR, self.IOCON1)
busVal2 = self.bus.read_byte_data(self.ADDR, self.IOCON2)
return busVal1, busVal2
else:
return None, None
def setMIRROR(self, bit = 6):
if self.chipOK:
busVal1 = self.bus.read_byte_data(self.ADDR, self.IOCON1)
busVal1 = busVal1 | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.IOCON1, busVal1)
busVal2 = self.bus.read_byte_data(self.ADDR, self.IOCON2)
busVal2 = busVal2 | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.IOCON1, busVal2)
def resetMIRROR(self, bit = 6):
if self.chipOK:
busVal1 = self.bus.read_byte_data(self.ADDR, self.IOCON1)
busVal1 = busVal1 & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.IOCON1, busVal1)
busVal2 = self.bus.read_byte_data(self.ADDR, self.IOCON2)
busVal2 = busVal2 & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.IOCON2, busVal2)
def setIPOL(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.ipolB = self.ipolB | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.IPOLB, self.ipolB)
else:
self.ipolA = self.ipolA | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.IPOLA, self.ipolA)
def resetIPOL(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.ipolB = self.ipolB & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.IPOLB, self.ipolB)
else:
self.ipolA = self.ipolA & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.IPOLA, self.ipolA)
def setGPINTEN(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.gpintenB = self.gpintenB | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.GPINTENB, self.gpintenB)
else:
self.gpintenA = self.gpintenA | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.GPINTENA, self.gpintenA)
def resetGPINTEN(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.gpintenB = self.gpintenB & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.GPINTENB, self.gpintenB)
else:
self.gpintenA = self.gpintenA & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.GPINTENA, self.gpintenA)
def falseDEFVAL(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.defvalB = self.defvalB | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.DEFVALB, self.defvalB)
else:
self.defvalA = self.defvalA | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.DEFVALA, self.defvalA)
def trueDEFVAL(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.defvalB = self.defvalB & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.DEFVALB, self.defvalB)
else:
self.defvalA = self.defvalA & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.DEFVALA, self.defvalA)
def setINTCON(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.intconB = self.intconB | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.INTCONB, self.intconB)
else:
self.intconA = self.intconA | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.INTCONA, self.intconA)
def resetINTCON(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.intconB = self.intconB & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.INTCONB, self.intconB)
else:
self.intconA = self.intconA & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.INTCONA, self.intconA)
def setGPPU(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.gppuB = self.gppuB | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.GPPUB, self.gppuB)
else:
self.gppuA = self.gppuA | (1 << bit)
self.bus.write_byte_data(self.ADDR, self.GPPUA, self.gppuA)
def resetGPPU(self, bank, pin):
if self.chipOK:
bit = pin - 1
if bank == 'B':
self.gppuB = self.gppuB & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.GPPUB, self.gppuB)
else:
self.gppuA = self.gppuA & (0xff - (1 << bit))
self.bus.write_byte_data(self.ADDR, self.GPPUA, self.gppuA)
def readINTF(self):
if self.chipOK:
busVal1 = self.bus.read_byte_data(self.ADDR, self.INTFA)
busVal2 = self.bus.read_byte_data(self.ADDR, self.INTFB)
return busVal1, busVal2
else:
return None, None
def readINTCAP(self):
if self.chipOK:
busVal1 = self.bus.read_byte_data(self.ADDR, self.INTCAPA)
busVal2 = self.bus.read_byte_data(self.ADDR, self.INTCAPB)
return busVal1, busVal2
else:
return None, None