#include "LTC2497.h"
#include <math.h>

#define DEBUG

LTC2497::LTC2497(const uint8_t address, double vref) : I2CDevice(address), _vref(vref), _adcRes(16), _quantum(_vref / (pow(2, _adcRes)-1))
{
  for(uint8_t i = 0; i < 3; i++)
    _dataBytes[i] = 0b00000000;
}

void LTC2497::setVref(double vref)
{
  _vref = vref;
  _quantum = _vref / (pow(2, _adcRes) - 1);
}

int32_t LTC2497::sampleValue(ADC_CHAN channel, boolean sgl)
{
  //1) On commence par écrire un octet contenant des options et l'adresse du channel a sampler
  //2) On lit la valeur samplée

  if(!isPresent)
  {
    #ifdef DEBUG
    Serial.println("Peripherique non present (penser à faire un begin)");
    #endif
    return 0;
  }

  uint8_t toBeWritten(0), retStatus(0), i(3);
  uint32_t value(0);

  toBeWritten |= 0b10100000;//On met les premiers bits à 101 afin de prendre en compte l'adresse du channel pour la mesure
  toBeWritten |= 0b00010000;//On met l'adc en single ended line et pas en mode différentiel
  toBeWritten |= channel;//On selectionne le channel

  twi->beginTransmission(address);
  twi->write(toBeWritten);
  if(twi->endTransmission() != 0)
  {
    //Erreur lors de la transmission
    #ifdef DEBUG
    Serial.println("Erreur lors de la transmission");
    #endif
    return 0;
  }
  
  retStatus = (size_t) twi->requestFrom(address, (size_t)3/*, true*/);

  if(retStatus == 0)
  {
    #ifdef DEBUG
    Serial.println("Erreur lors de la reception du sample");
    #endif
    return 0;
  }

  while(twi->available())
  {
    _dataBytes[--i] = twi->read();

    if(i == 0) //!i c'est ok aussi
    {
      break;
    }
  }

  //Traitement des données recues
  value |= _dataBytes[2];
  //On met à zero les deux derniers bits
  value &= 0b00111111;
  value << 8;
  value |= _dataBytes[1];
  _dataBytes[0] >> 6;
  value << 2;
  value |= _dataBytes[0];

  return value;
}

int32_t LTC2497::sampleValue()
{
  if(!isPresent)
  {
    #ifdef DEBUG
    Serial.println("Peripherique non present (penser à faire un begin)");
    #endif
    return 0;
  }
  
  uint8_t toBeWritten(0), retStatus(0), i(3);
  uint32_t value(0);

  toBeWritten |= 0b10000000;//On met les premiers bits à 100 pour demander à resample le channel précédent
  

  twi->beginTransmission(address);
  twi->write(toBeWritten);
  if(twi->endTransmission() != 0)
  {
    //Erreur lors de la transmission
    #ifdef DEBUG
    Serial.println("Erreur lors de la transmission");
    #endif
    return 0;
  }

  retStatus = (size_t) twi->requestFrom(address, (size_t)3/*, true*/);

  if(retStatus == 0)
  {
    #ifdef DEBUG
    Serial.println("Erreur lors de la reception du sample");
    #endif
    return 0;
  }

  while(twi->available())
  {
    _dataBytes[--i] = twi->read();

    if(i == 0) //!i c'est ok aussi
    {
      break;
    }
  }

  //Traitement des données recues
  value |= _dataBytes[2];
  //On met à zero les deux derniers bits
  value &= 0b00111111;
  value << 8;
  value |= _dataBytes[1];
  _dataBytes[0] >> 6;
  value << 2;
  value |= _dataBytes[0];

  return value;
}

double LTC2497::sampleVoltage(ADC_CHAN channel, boolean sgl)
{
  
}

double LTC2497::sampleVoltage()
{
  
}
