import smbus,sys
from time import sleep
import colorama
from colorama import init, Fore, Back, Style

class MLX90614():

    MLX90614_RAWIR1=0x04
    MLX90614_RAWIR2=0x05
    MLX90614_TA=0x06
    MLX90614_TOBJ1=0x07
    MLX90614_TOBJ2=0x08

    MLX90614_TOMAX=0x20
    MLX90614_TOMIN=0x21
    MLX90614_PWMCTRL=0x22
    MLX90614_TARANGE=0x23
    MLX90614_EMISS=0x24
    MLX90614_CONFIG=0x25
    MLX90614_ADDR=0x0E
    MLX90614_ID1=0x3C
    MLX90614_ID2=0x3D
    MLX90614_ID3=0x3E
    MLX90614_ID4=0x3F

    comm_retries = 5
    comm_sleep_amount = 0.1

    def __init__(self, address=0x5a, bus_num=1):
        self.bus_num = bus_num
        self.address = address
        self.bus = smbus.SMBus(bus=bus_num)

    def read_reg(self, reg_addr):
        err = None
        for i in range(self.comm_retries):
            try:
                return self.bus.read_word_data(self.address, reg_addr)
            except IOError as e:
                err = e
                #"Rate limiting" - sleeping to prevent problems with sensor
                #whenMLX90614 requesting data too quickly
                sleep(self.comm_sleep_amount)
        #By this time, we made a couple requests and the sensor didn't respond
        #(judging by the fact we haven't returned from this function yet)
        #So let's just re-raise the last IOError we got
        raise err

    def data_to_temp(self, data):
        # Convert Temp data to Celsius
        temp = (data*0.02) - 273.15
        return temp

    def get_amb_temp(self):
        data = self.read_reg(self.MLX90614_TA)
        return self.data_to_temp(data)

    def get_obj_temp(self):
        data = self.read_reg(self.MLX90614_TOBJ1)
        return self.data_to_temp(data)


if __name__ == "__main__":
    
    low_temp=30.0
    high_temp=37.5
    
    init(autoreset=True)
    sensor = MLX90614()
    while True:
        try:
            #print(sensor.get_amb_temp())
            print ('Ambient Temp: % 6.2f Celsius' % sensor.get_amb_temp())
            #print(sensor.get_obj_temp())
            obj_temp=sensor.get_obj_temp()
            if (obj_temp < low_temp):
                print (Fore.WHITE + Back.BLUE + 'Object Temp: % 6.2f Celsius' % obj_temp)
            elif ((obj_temp > low_temp) and (obj_temp < high_temp)):
                print (Fore.WHITE + Back.GREEN + Style.BRIGHT + 'Object Temp: % 6.2f Celsius' % obj_temp)
            elif (obj_temp > high_temp):
                print (Fore.WHITE + Back.RED + 'Object Temp: % 6.2f Celsius' % obj_temp)
            print 
            sleep(0.5)
        except (KeyboardInterrupt, SystemExit):
            sys.exit() 
