#include "Light.h"

void LS_init(){
    //i2c_read_LS(0x00); // device ID ?


    i2c_write_LS(HW_KEY,0x17);

    /*i2c_write_LS(COMMAND,0x00);
    while (i2c_read_LS(RESPONSE) != 0x00) {
        i2c_write_LS(COMMAND,0x00);
    }
    i2c_write_LS(COMMAND,0x01);*/

    i2c_write_LS(INT_CFG,0x01); // ENABLE INTERRUPTS
    i2c_write_LS(IRQ_ENABLE,0x01);

    i2c_write_LS(MEAS_RATE1,0x3E); // Set Measurement rate
    i2c_write_LS(MEAS_RATE0,0x80);

    i2c_write_LS(PARAM_WR,0x80); // CHLIST
    i2c_write_LS(COMMAND,0xA1);
    /*i2c_write_LS(COMMAND,0x00);
    while (i2c_read_LS(RESPONSE) != 0x00) {
        i2c_write_LS(COMMAND,0x00);
    }
    i2c_write_LS(COMMAND,0xA1);
    while (i2c_read_LS(RESPONSE) != 0xA1) {
        i2c_write_LS(COMMAND,0xA1);
    }*/

    i2c_write_LS(UCOEF3,0x00); // Enable UV reading
    i2c_write_LS(UCOEF2,0x02);
    i2c_write_LS(UCOEF1,0x89);
    i2c_write_LS(UCOEF0,0x29);
}

unsigned int LS_measure(void){
    unsigned int uv_data_low, uv_data_high;
    unsigned int uv_data;
    i2c_write_LS(IRQ_STATUS,0x01); // clear interrupt in light sensor
    uv_data_low = i2c_read_LS(UVINDEX0);
    uv_data_high = i2c_read_LS(UVINDEX1);
    uv_data = ((uv_data_high)<<8) |(uv_data_low);
    return uv_data; // /100
}

void i2c_write_LS(char address, char data)
{
    int ack;
    i2c_start();
    ack = i2c_send(WRITE_LS);
    ack = i2c_send(address);
    ack = i2c_send(data);
    do{
        i2c_start();
        ack = i2c_send(WRITE_LS);
    } while (ack);
    i2c_stop();
    IFS1bits.I2C2MIF = 0;
}

unsigned char i2c_read_LS(char address)
{
    char read_value;
    i2c_start();
    read_value = i2c_send(WRITE_LS);
    //read_value = i2c_send(0x00); // high byte
    read_value = i2c_send(address);
    i2c_restart();
    read_value = i2c_send(READ_LS);
    read_value = i2c_receive();
    I2C2CONbits.ACKDT = 1; // 1
    I2C2CONbits.ACKEN = 1;
    while(!IFS1bits.I2C2MIF);
    IFS1bits.I2C2MIF = 0;
    I2C2CONbits.ACKDT = 0; // 0
    i2c_stop();
    return read_value;
}
