import smbus2 as smbus

class tbt36_lib(object):
    TBT36_Dev_ADDR              =0x53

    TBT36_DEVID				    =0xE5

    TBT36_REG_DEVID		    	=0x00
    TBT36_REG_THRESH_TAP		=0x1d
    TBT36_REG_OFS_X			    =0x1E
    TBT36_REG_OFS_Y			    =0x1F
    TBT36_REG_OFS_Z			    =0x20
    TBT36_REG_DUR				=0x21
    TBT36_REG_LATENT			=0x22
    TBT36_REG_WINDOW			=0x23
    TBT36_REG_THRESH_ACT		=0x24
    TBT36_REG_THRESH_INACT  	=0x25
    TBT36_REG_TIME_INCAT		=0x26
    TBT36_REG_ACT_INACT_CTL	    =0x27
    TBT36_REG_THRESH_FF		    =0x28
    TBT36_REG_TIME_FF			=0x29
    TBT36_REG_TAP_AXES		    =0x30
    TBT36_REG_ACT_TAPSTATUS 	=0x2B
    TBT36_REG_BW_RATE			=0x2C
    TBT36_REG_POWER_CTL		    =0x2D
    TBT36_REG_INT_ENABLE		=0x2E
    TBT36_REG_INT_MAP			=0x2F
    TBT36_REG_INT_SOURCE		=0x30
    TBT36_REG_DATA_FORMAT		=0x31
    TBT36_REG_DATA_X0			=0x32
    TBT36_REG_DATA_X1			=0x33
    TBT36_REG_DATA_Y0			=0x34
    TBT36_REG_DATA_Y1			=0x35
    TBT36_REG_DATA_Z0			=0x36
    TBT36_REG_DATA_Z1			=0x37
    TBT36_REG_FIFO_CTL	    	=0x38
    TBT36_REG_FIFO_STATUS		=0x39
    TBT36_REG_TA_SIGN			=0x3A
    TBT36_REG_ORIENT_CONF		=0x3B
    TBT36_REG_ORIENT			=0x3C
    def __init__(self,bus_num):
        self.bus = smbus.SMBus(bus_num)
        self.result = self.__tbt36_init()
    def __tbt36_init(self):
        '''
        Initialization of the Tibbit and setting of the correspondig settings\r\n
        :param bus: I2C bus that communicate with the Tibbit\r\n
        :return: Boolean Pass fail to communicate with Tibbit\r\n
        '''
        self.DEV_ID = 0x00

        self.DEV_ID = self.bus.read_byte_data(self.TBT36_Dev_ADDR,self.TBT36_REG_DEVID)
        if self.DEV_ID != self.TBT36_DEVID:
            return False
        
        self.DEV_Format = 0x00 | 0x08
        self.DEV_Format=self.DEV_Format or 0x00
        self.bus.write_byte_data(self.TBT36_Dev_ADDR,self.TBT36_REG_DATA_FORMAT,self.DEV_Format)
        self.bus.write_byte_data(self.TBT36_Dev_ADDR,self.TBT36_REG_BW_RATE,0x06)
        self.bus.write_byte_data(self.TBT36_Dev_ADDR,self.TBT36_REG_FIFO_CTL,0x90)
        self.bus.write_byte_data(self.TBT36_Dev_ADDR,self.TBT36_REG_POWER_CTL,0x08)
        return True

    def imu_proc_data(self):
        '''
        Get the impact values from IC\r\n
        :param bus: I2C bus that communicate with the Tibbit\r\n
        :return: X Y Z values after conversion\r\n
        '''
        x=0
        y=0
        z=0
        num = self.bus.read_byte_data(self.TBT36_Dev_ADDR,self.TBT36_REG_FIFO_STATUS)
        if num == 0 :
            return x,y,z
        
        for i in range (0,num):

            value_list = self.bus.read_i2c_block_data(self.TBT36_Dev_ADDR,self.TBT36_REG_DATA_X0,6)
            x = value_list[0] + (value_list[1]*256)
            y = value_list[2] + (value_list[3]*256)
            z = value_list[4] + (value_list[5]*256)

            if num != 32: 
                break 
            
        if (x<0): x=x*-1
        if (y<0): y=y*-1
        if (z<0): z=z*-1

        return self.__convert_impact(x),self.__convert_impact(y),self.__convert_impact(z)

    def __convert_impact(self,value):
        '''
        Converts the value that is read from the IC to X Y Z values\r\n
        :param value: Value to convert\r\n
        :retrun: converted value\r\n
        '''
        tmp_f = float(value)*29.0/100.0
        tmp_f = tmp_f/100.0
        return tmp_f