#include <xc.h>
#include <stdio.h>
#include <string.h>
#include "timer.h"
#include "i2c1.h"
#include "ABP2.h"

extern unsigned short ABP2Data[8];

unsigned short ABP2_read(void)
{
    int i = 0;
    int j = 0;
    //begin with I2C START
    i2c1_start();
    usWait(50);
    //msWait(1);
    //send 7bit addr followed by read bit '1'
    //addr = (ABP2_addr << 1) | 0x1;
  
    
    //first send command
    i2c1_TXData(ABP2_write_addr);
    i2c1_wait_for_ACK(10);
    //msWait(2);
    i2c1_TXData(0xAA);
    i2c1_wait_for_ACK(10);
    //msWait(2);
    i2c1_TXData(0x00);
    i2c1_wait_for_ACK(10);
    //msWait(2);
    i2c1_TXData(0x00);
    i2c1_wait_for_ACK(10);
    //msWait(2);
    //reset_i2c1_bus();
    i2c1_stop();
    usWait(20000);  //delay for sensor to read
    
    
    //7 bytes follow with master ACK'ing each byte
    i2c1_start();
    usWait(50);
    i2c1_TXData(ABP2_read_addr);
    i2c1_wait_for_ACK(10);
    //msWait(2);
    

    //now get the bytes
    for (i=0; i<6; i++)
    { 
        //set I2C module to receive
        I2C1CONbits.RCEN = 1;
        while (!I2C1STATbits.RBF)
        {
        j++;
        if (j > 20000) break;
        }
        
        ABP2Data[i] = i2c1_RXData();
        usWait(10);
        if (i < 5) //dont ACK the last byte
        {
            i2c1_sendACK();
            usWait(10);
        }
    }//*/
    
    //now get the last byte
    
    //usWait(200);
    //i2c1_stop();
    //I2C1CONbits.RCEN = 0;
    
    reset_i2c1_bus();
    return(0);
}

unsigned long ABP2_pressure(void)
{
    unsigned long pressure=0;
    unsigned long data=0;
    
    pressure = ABP2Data[1];
    pressure = pressure << 16;
    data = ABP2Data[2];
    data = data << 8;
    pressure = pressure | data;
    data = ABP2Data[3];
    pressure = pressure | data;
    //(ABP2Data[1]<<16) | (ABP2Data[2]<<8) | (ABP2Data[3])
    //pressure = (ABP2Data[1]<<16);
    //return( (ABP2Data[1]<<16) | (ABP2Data[2]<<8) | (ABP2Data[3])   );
    return(pressure);
}

unsigned long ABP2_temp(void)
{
    unsigned long temp=0;
    unsigned long data=0;
    
    temp = ABP2Data[4];
    temp = temp << 16;
    data = ABP2Data[5];
    data = data << 8;
    temp = temp | data;
    data = ABP2Data[6];
    temp = temp | data;
    return(temp);
}

double ABP2_P_psi(void)
{
    double P = -99;
    double OutputMax = 15099494;    //counts (90% 24bit)
    double OutputMin = 1677722;    //counts (10% 24bit)
    double Pmax = 5;   //psi
    double Pmin =-5;  //psi

    //printf("%f,%f,%f,%f\n",OutputMax,OutputMin,Pmax,Pmin);
    P = (((ABP2_pressure()-OutputMin)*(Pmax-Pmin)) / (OutputMax-OutputMin)) + Pmin;
    return(P);
}

double ABP2_T_degC(void)
{
    double T = -99;

    //printf("T = %f\n",(double)ABP2_temp());
    T = (   (200*((double)ABP2_temp()/16777215)) - 50 );
    
    return(T);
}

