# Classes and functions for accessing the i2c_counter board
import smbus
import time

class I2C_counter:
    #'Class for accessing the Homechip Ltd counter board'

    def __init__(self, bus, i2caddr, counter):
        self.bus = smbus.SMBus(bus)
        self.addr = i2caddr
        self.no = counter
        self.lastValue = 0
        try:
            self.value = self.bus.read_word_data(self.addr, (self.no * 2) + 4)
        except IOError as e:
            print("error in accessing I2C:", e)
        self.lastDeltaValue = self.value

    def readCount(self):
        #'Read the raw counter value'
        try:
            self.value = self.bus.read_word_data(self.addr, (self.no * 2) + 4)
        except IOError as e:
            print("error in accessing I2C:", e)
        return self.value

    def readCountDelta(self):
        #'Read the delta from the last read'
        try:
            self.deltaValue = self.bus.read_word_data(self.addr, (self.no * 2) + 4)
        except IOError as e:
            print("error in accessing I2C:", e)
        if (self.deltaValue < self.lastDeltaValue):
            self.delta = 0xffff + self.deltaValue - self.lastDeltaValue
        else:
            self.delta = self.deltaValue - self.lastDeltaValue
        self.lastDeltaValue = self.deltaValue
        return self.delta

    def setDebounce(self, on):
        #'Set the Debounce on/off'
        try:
            self.debounce = self.bus.read_byte_data(self.addr, 2)
        except IOError as e:
            print("error in accessing I2C:", e)
        if (on):
            self.debounce = self.debounce | (1 << self.no)
        else:
            self.debounce = self.debounce & ~(1 << self.no)
        try:
            self.bus.write_byte_data(self.addr, 2, self.debounce)
        except IOError as e:
            print("error in accessing I2C:", e)

    def setInputLevel(self, on):
        #'Set Input level to either TTL (0) or Schmitt trigger (1)'
        try:
            self.inputLevel = self.bus.read_byte_data(self.addr, 3)
        except IOError as e:
            print("error in accessing I2C:", e)
        if (on):
            self.inputLevel = self.inputLevel | (1 << self.no)
        else:
            self.inputLevel = self.inputLevel & ~(1 << self.no)
        try:
            self.bus.write_byte_data(self.addr, 3, self.inputLevel)
        except IOError as e:
            print("error in accessing I2C:", e)

