# Christian Fiot 2020
# Temperature sensor IIC Bus1

# Usage:
# from MCP9808 import MCP9808
#
# TBatt = MCP9808(24, sda='P20', scl='P19', traceDebug=True)
# TBatt.begin()  # return True if chip is found
# TBatt.readC()
#
# TVent = MCP9808(25, traceDebug=True)
# TVent.begin()   # return True if chip is found
#

from trap import * # 2.2.9b
from machine import I2C # 2.2.18


class MCP9808():

    def __init__(self, iicadr=0x018, i2c=None, sda='P22', scl='P21', traceDebug=False, sdAccess = False): # 2.2.9b
        self.trace = traceDebug
        self.adr = iicadr
        self.sdAccess = sdAccess # 2.2.9b

        self.data = bytearray(2)
        self.temp = 0

        # I2C bus declaration is extenal
        # MCP are connected on I2C bus #1   SDA-P22   SCL-P21
        #                      I2C bus #2   SDA-P18   SCL-P17
        #
        if i2c is not None: # 2.2.18
            self.i2c1 = i2c
        else:
            # from machine import I2C
            self.i2c1 = I2C(0, mode=I2C.MASTER, pins=(sda, scl))



    def getWord(self, high, low):
        return ((high & 0xFF) << 8) + (low & 0xFF)


    # Returns True if the device is intialized, False otherwise.
    def begin(self):
        try:
            self.i2c1.readfrom_mem_into(self.adr, 6, self.data)  # 0110 = Manufacturer ID register
            mid = self.getWord(self.data[0], self.data[1])
            self.i2c1.readfrom_mem_into(self.adr, 7, self.data)   # 0111 = Device ID/Revision register
            did = self.getWord(self.data[0], self.data[1])

            if self.trace :
                print('Read manufacturer ID: {0:04X}'.format(mid))
                print('Read device ID: {0:04X}'.format(did))
            print('Detected MCP9808 - Temp Sensor Adr:' + str(self.adr) ) # 2.2.2b

        except Exception as e: # 2.2.9b
            scratch = 'MCP9808 - Temp Sensor  Adr:' + str(self.adr) + ' not found - '  # 2.2.9b  print('MCP9808 - Temp Sensor  Adr:' + str(self.adr) + ' not found')
            file_errLog(0, scratch + str(e), self.sdAccess)  # 2.2.9b
            # 2.2.18 print('Begin I2C1 scan ...')
            # 2.2.18 print(self.i2c1.scan())
            mid = 0
            did = 0

        finally:
            return mid == 0x0054 and did == 0x0400

    def Convert_C2F(self, DataC):
        return (DataC * 9/5) + 32

    # Read sensor and return its value in degrees celsius.
    def readC(self):
        self.i2c1.readfrom_mem_into(self.adr, 5, self.data)     # 0101 = Temperature register
        t = self.getWord(self.data[0], self.data[1])

        if self.trace :
            print('Raw ambient temp register value: 0x{0:04X}'.format(t & 0xFFFF))

        # Scale and convert to signed value.
        temp = (t & 0x0FFF) / 16.0
        if t & 0x1000:
            temp -= 256.0

        self.temp = temp
        return temp
