#ifndef MEASUREUNIT_H
#define MEASUREUNIT_H
#include "Ads1115.h"
#include "ThermistorSetting.h"

//#define DEBUG_TEMP

class MeasureUnit
{
  public:
    enum ERROR {OK = 0, MALLOC_ERR = 1};
    MeasureUnit(uint8_t *analogInput, uint16_t thermistorCount, uint64_t precResistor, ThermistorSetting thermistorSetting, Adc &adc);
    ~MeasureUnit();
    void init();
    void run();
    void startOffsetComputing();
    void setOffsetIteration(uint8_t iteration);
    void setGlobalTempOffset(double offset);
    void levelTemperaturesOff();
    double getGlobalTempOffset();
    double *getTemperatures();
    double *getROffsetMap();

    //Async methods
    enum STATE {IDLING, MEASURING, COMPUTING, MEASUREMENT_READY};
    boolean startTemperatureMeasurement();
    boolean isMeasurementReady();
    double *getAsyncTemperatures();
    void levelAsyncTemperaturesOff();
    //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)
    uint8_t *_analogInput; //Pointeur qui garde l'adresse du tableau contenant le nom des entrées analogiques
    uint16_t _thermistorCount;
    uint64_t _precResistor;
    ERROR _error;

    Adc &_adc;
    ThermistorSetting _thermistorSetting;
    
    //Async part
    STATE _state;
    uint8_t _channel, _offsetComputeIte,_offsetCounter;
    double _courant, _tension;
    boolean _triggerLevelOff; //Attribut permettant de savoir si un étalonnage a été demandé
};

#endif //MEASUREUNIT_H
