#pragma once

#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define AVG10_SAMPLE_SIZE 10U
#define AVG60_SAMPLE_SIZE 60U

typedef enum _BurnerErrorState
{
    NO_ERROR,
    FAULT
} eBurnerErrorState;

typedef enum _MeasurementErrorState
{
    MEASUREMENT_NO_ERROR,
    MEASUREMENT_FAULT
} eMeasurementErrorState;

typedef struct _Average
{
    float fValue;
    float samples[MAX(AVG10_SAMPLE_SIZE, AVG60_SAMPLE_SIZE)];
    size_t bufferIndex;
    size_t bufferCount;
} sAverage;

typedef struct _Measurement
{
    float fCurrentValue;
    sAverage average10s;
    sAverage average60s;
    eMeasurementErrorState state;
} sMeasurement;

void initInputs(void);
sMeasurement getChamberTemperature(void);
sMeasurement getOutdoorTemperature(void);
sMeasurement getInletFlowTemperature(void);
sMeasurement getReturnFlowTemperature(void);
eBurnerErrorState getBurnerError(void);