//
//  LTC2439.cpp
//  libLTC
//
//  Created by Tim THUREL on 04/03/2020.
//  Copyright © 2020 Tim THUREL. All rights reserved.
//

#include "MesureADC.h"


MesureADC::MesureADC(int vref,int maxval,int res_mesure,int v_alim, int beta, int r_therm ){
    
    vreference = vref; // tension de référence
    maximumval = maxval;  // valeur max de l'ADC
    res_courant = res_mesure; // resistence de mesure de courant
    tension_alim = v_alim; // tension de l'alimentation
    beta_therm = beta; // beta des thermitance 
    res_therm = r_therm; // résistance des termistance
}

float * MesureADC::ReadTemp(int adcCS){
    mesureV(adcCS);
    i1 = mesureI(tableV1); // mesure des courant
    i2 = mesureI(tableV2);
    temp(); // mesure de la température
    for (int i = 0; i < 8; i++) {
        out[i] = T1[i];
    }
    int j = 8;
    for (int i = 0; i < 8; i++) {
        out[j] = T2[i];
        j++;
    }
    return out;
}
void MesureADC::mesureV(int CS){
    LTC adc(CS); // création de l'objet
    long valeur;
    float val;
  
    for(int i = 0; i < 16; i++){ // mesure de chaque channel et convesion en Volt
        valeur = adc.readValue(i);
        val = ((valeur * vreference) / maximumval); // conversion en volt
        val = val + vreference; // ramène la valeur avec la tension de référence ( la tension centre est Vref donc on a des tension négative)
        if(i < 8 ){
            tableV1[i] = val;
        }
        else{
            tableV2[i - 8] = val;
        }
    }
}

float MesureADC::mesureI(float *table){ // retourne la valeur du courant en mA
    return (table[0]/res_courant);
}

void MesureADC::volt(){ // mesure la tention des thermistances
    
    for (int j = 1; j < 7; ++j) // fait la mesure de la résistance 1 à 6
    {
        tableVR1[j] = tableV1[j +1] - tableV1[j] ;
    }
    tableVR1[0] = tableV1[1] - tableV1[0]; // fait la mesure de la résistance 0
    tableVR1[7] = tension_alim - tableV1[7] ; // fait la mesure de la résistance 7
  
    for (int j = 1; j < 7; ++j) // fait la mesure de la résistance 1 à 6
    {
        tableVR2[j] = tableV2[j +1] - tableV2[j] ;
    }
    tableVR2[0] = tableV2[1] - tableV2[0]; // fait la mesure de la résistance 0
    tableVR2[7] = tension_alim - tableV2[7] ; // fait la mesure de la résistance 7
    
    
}

void MesureADC::temp(){  // calcul de la température
    res();
    for (int j = 0; j < 8; ++j) // utilise la formule de calcul pour calculer les 8 valeur de températures
    {
        T1[j] = ((298.15*beta_therm)/(beta_therm+298.15*log(tableR1[j]/res_therm)))- 273.15;
    }
    for (int j = 0; j < 8; ++j) // utilise la formule de calcul pour calculer les 8 valeur de températures
    {

        T2[j] = ((298.15*beta_therm)/(beta_therm+298.15*log(tableR2[j]/res_therm)))- 273.15;
    }
}

void MesureADC::res(){ // calcul la valeur de la resistance
    volt(); // mesure de la tention des thermistances
    for (int j = 0; j < 8; ++j) // fait une loi d'Ohm pour calculer les 8 valeur des résistance
    {
        tableR1[j] = tableVR1[j] / i1;
    }
    for (int j = 0; j < 8; ++j) // fait une loi d'Ohm pour calculer les 8 valeur des résistance
    {
        tableR2[j] = tableVR2[j] / i2;
    }
}
