/******************************************************************************/
/*        @TITLE : TMP006.c                                                   */
/*      @VERSION : 0                                                          */
/*     @CREATION : JANUARY 3, 2017                                            */
/* @MODIFICATION :                                                            */
/*      @AUTEURS : ANTONIO BIZA                                               */
/*    @COPYRIGHT : Copyright (c) 2017 ANTONIO BIZA                            */
/*      @LICENSE :                                                            */
/******************************************************************************/
#include "TMP006.h"
#include "I2C.h"
#include "math.h"

void TMP006_init(void){
    /*SPECIFY SLAVE ADDRESS FOR TMP006*/

    I2C_setslave(TMP006_SLAVE_ADDRESS);

    /* RESET TMP006 */
    I2C_write(TMP006_SLAVE_ADDRESS, TMP006_RST,REGISTER_LENGTH);
//int I2C_write(uint8_t address, uint8_t *data, uint8_t length)
    volatile int i;
    for (i=10000; i>0;i--);

    /* POWER-UP AND RE-ENABLE DEVICE */
    I2C_write(TMP006_SLAVE_ADDRESS, TMP006_POWER_UP | TMP006_CR_2,REGISTER_LENGTH);
}

int TMP006_readDeviceId(void){
    /*SPECIFY SLAVE ADDRESS FOR TMP006 */
    I2C_setslave(TMP006_SLAVE_ADDRESS);

    return I2C_read(TMP006_SLAVE_ADDRESS,,REGISTER_LENGTH);
}

int TMP006_readObjectVoltage(void){
    /*SPECIFY SLAVE ADDRESS FOR TMP006*/
    I2C_setslave(TMP006_SLAVE_ADDRESS);

    return I2C_read(TMP006_SLAVE_ADDRESS,,REGISTER_LENGTH);
}

int TMP006_readAmbientTemperature(void)
{
    /*SPECIFY SLAVE ADDRESS FOR TMP006*/
    I2C_setslave(TMP006_SLAVE_ADDRESS);

    return I2C_read(TMP006_SLAVE_ADDRESS,,REGISTER_LENGTH);
}


/*READS DATA FROM SENSOR AND CALCULATE THE OBJECT TEMPERATURE*/
long double TMP006_getTemp(void){
    volatile int Vobj = 0;
    volatile int Tdie = 0;
    static long double S0 = 0;          /* CALIBRATION CONSTANT FOR TMP006 */

    Vobj = TMP006_readDeviceId();

    /*READ THE OBJECT VOLTAGE*/
    Vobj = TMP006_readObjectVoltage();

    /*READ THE AMBIENT TEMPERATURE*/
    Tdie = TMP006_readAmbientTemperature();
    Tdie = Tdie >> 2;

    /*CALCULATE TMP006. THIS NEED TO BE REVIEWED AND CALIBRATED*/
    long double Vobj2 = (double)Vobj*.00000015625;
    long double Tdie2 = (double)Tdie*.03525 + 273.15;

    /*INITIALIZE CONSTANTS*/
    S0 = 6 * pow(10, -14);
    long double a1 = 1.75*pow(10, -3);
    long double a2 = -1.678*pow(10, -5);
    long double b0 = -2.94*pow(10, -5);
    long double b1 = -5.7*pow(10, -7);
    long double b2 = 4.63*pow(10, -9);
    long double c2 = 13.4;
    long double Tref = 298.15;

    /*CALCULATE VALUE*/
    long double S = S0*(1+a1*(Tdie2 - Tref)+a2*pow((Tdie2 - Tref),2));
    long double Vos = b0 + b1*(Tdie2 - Tref) + b2*pow((Tdie2 - Tref),2);
    volatile long double fObj = (Vobj2 - Vos) + c2*pow((Vobj2 - Vos),2);
    volatile long double Tobj = pow(pow(Tdie2,4) + (fObj/S),.25);
    Tobj = (9.0/5.0)*(Tobj - 273.15) + 32;

    /*RETURN OBJECT TEMPERATURE */
    return (Tobj);
}
