#ifndef MEASUREUNIT_H
#define MEASUREUNIT_H
#include <LTC2439.h>
#include "ThermistorSettings.h"

class MeasureUnit
{
  public:
    enum ERROR {OK = 0, MALLOC_ERR = 1};
    MeasureUnit(uint16_t thermistorCount, uint64_t precResistor, ThermistorSettings thermistorSettings, LTC2439 &adc);
    ~MeasureUnit();
    void init();
    void run();
    
    void setGlobalTempOffset(double offset);
    double getGlobalTempOffset();
    double *getROffsetMap();

    //Async methods
    enum STATE {IDLING, MEASURING, COMPUTING, MEASUREMENT_READY};
    boolean startTemperatureMeasurement();
    boolean isMeasurementReady();
    double *getAsyncTemperatures();
    //End of assync methods

    ERROR getError(){return _error;}
    
  protected:
  private:
    double computeTemperature(double beta, double resistance, double rAt25);
    
    double _globalOffset; //Correspond à l'offset global nécessaire afin d'avoir une température qui corresponde à la réalité
    double *_temperatures; //Tableau contenant toutes les températures
    double *_rOffsetMap,*_rOffsetBuffer; //Tableau qui contient les offsets individuels pour chaque thermistance
    double *_resistanceMap; //Tableau qui contient les resistances associées aux thermistances (pour debug seulement)
    uint16_t _thermistorCount;
    uint64_t _precResistor;
    ERROR _error;

    LTC2439 &_adc;
    ThermistorSettings _thermistorSettings;
    
    //Async part
    STATE _state;
    uint8_t _channel, _offsetComputeIte,_offsetCounter;
    double _courant[2];
    boolean _triggerLevelOff; //Attribut permettant de savoir si un étalonnage a été demandé
};

#endif //MEASUREUNIT_H
