import  time

TCS34725_ADDRESS = 41

TCS34725_COMMAND_BIT = 0xA0

TCS34725_ENABLE           = 0x00
TCS34725_ENABLE_AIEN      = 0x10    
TCS34725_ENABLE_WEN       = 0x08  
TCS34725_ENABLE_AEN       = 0x02   
TCS34725_ENABLE_PON       = 0x01    
TCS34725_ATIME            = 0x01   
TCS34725_WTIME            = 0x03   
TCS34725_WTIME_2_4MS      = 0xFF    
TCS34725_WTIME_204MS      = 0xAB  
TCS34725_WTIME_614MS      = 0x00   
TCS34725_AILTL            = 0x04    
TCS34725_AILTH            = 0x05
TCS34725_AIHTL            = 0x06    
TCS34725_AIHTH            = 0x07
TCS34725_PERS             = 0x0C   
TCS34725_PERS_NONE        = 0b0000  
TCS34725_PERS_1_CYCLE     = 0b0001  
TCS34725_PERS_2_CYCLE     = 0b0010  
TCS34725_PERS_3_CYCLE     = 0b0011 
TCS34725_PERS_5_CYCLE     = 0b0100  
TCS34725_PERS_10_CYCLE    = 0b0101  
TCS34725_PERS_15_CYCLE    = 0b0110  
TCS34725_PERS_20_CYCLE    = 0b0111 
TCS34725_PERS_25_CYCLE    = 0b1000 
TCS34725_PERS_30_CYCLE    = 0b1001  
TCS34725_PERS_35_CYCLE    = 0b1010 
TCS34725_PERS_40_CYCLE    = 0b1011 
TCS34725_PERS_45_CYCLE    = 0b1100  
TCS34725_PERS_50_CYCLE    = 0b1101  
TCS34725_PERS_55_CYCLE    = 0b1110  
TCS34725_PERS_60_CYCLE    = 0b1111 
TCS34725_CONFIG           = 0x0D
TCS34725_CONFIG_WLONG     = 0x02   
TCS34725_CONTROL          = 0x0F  
TCS34725_ID               = 0x12    
TCS34725_STATUS           = 0x13
TCS34725_STATUS_AINT      = 0x10   
TCS34725_STATUS_AVALID    = 0x01   
TCS34725_CDATAL           = 0x14    
TCS34725_CDATAH           = 0x15
TCS34725_RDATAL           = 0x16  
TCS34725_RDATAH           = 0x17
TCS34725_GDATAL           = 0x18   
TCS34725_GDATAH           = 0x19
TCS34725_BDATAL           = 0x1A  
TCS34725_BDATAH = 0x1B

TCS34725_GAIN_1X =0x00


class TCS34725:
  
  def __init__(self, i2c, address=TCS34725_ADDRESS):
    self.i2c = i2c
    self.address = address
    
    sensor_id = self.sensor_id()
    if not sensor_id & 0x44:
      raise RuntimeError("bad sensor id 0x{:x}".format(sensor_id))
      
    
    self.writeMem8(TCS34725_ENABLE, TCS34725_ENABLE_PON)

    time.sleep(0.3)
    self.writeMem8(TCS34725_ENABLE, TCS34725_ENABLE_PON | TCS34725_ENABLE_AEN); 


    
  def sensor_id(self):
    return self.readMem(TCS34725_ID)  
    
  def readMem(self,reg):
    return self.i2c.readfrom_mem(TCS34725_ADDRESS,TCS34725_COMMAND_BIT|reg,1)[0]

  def readMem16(self,reg):
      return self.i2c.readfrom_mem(TCS34725_ADDRESS,TCS34725_COMMAND_BIT|reg,2)
    

  def writeMem8(self,reg,value):
    valarr = bytearray(1)
    valarr[0] = value
    self.i2c.writeto_mem(TCS34725_ADDRESS,TCS34725_COMMAND_BIT|reg,valarr)

  def setGain(self,gain_level):
    self.writeMem8(TCS34725_CONTROL,gain_level)
   
  def readInt(self,register):
    val = self.readMem16(register)
    retval = val[0]<<8 | val[1]
    return retval

  
    
  def getRawValues(self):  
    c = self.readInt(TCS34725_CDATAL)
    r = self.readInt(TCS34725_RDATAL)
    g = self.readInt(TCS34725_GDATAL)
    b = self.readInt(TCS34725_BDATAL)
    return [r,g,b,c]