Files
smart-oil-heating-control-s…/main/inputs.h
2026-01-10 13:32:49 +01:00

134 lines
4.1 KiB
C

/**
* @file inputs.h
* @brief Input handling for temperature sensors and burner fault detection.
*
* This module reads DS18B20 temperature sensors via 1-Wire and monitors
* the burner fault input. It provides averaged, damped, and predicted
* temperature values.
*/
#pragma once
#include "sdkconfig.h"
#include "esp_err.h"
#include <stddef.h>
/** @brief Returns the maximum of two values. */
#define MAX(a, b) ((a) > (b) ? (a) : (b))
/** @brief Initial value for measurements before first reading. */
#define INITIALISATION_VALUE 0.0f
/** @brief Sample buffer size for 10-second average. */
#define AVG10S_SAMPLE_SIZE 10U
/** @brief Sample buffer size for 60-second average. */
#define AVG60S_SAMPLE_SIZE 60U
/** @brief Sample buffer size for 24-hour average. */
#define AVG24H_SAMPLE_SIZE 24U
/** @brief Sample buffer size for 60-second prediction. */
#define PRED60S_SAMPLE_SIZE 60U
/** @brief Damping factor for rising temperatures (from Kconfig). */
#define DAMPING_FACTOR_WARMER (CONFIG_DAMPING_FACTOR_WARMER * 0.00001f)
/** @brief Damping factor for falling temperatures (from Kconfig). */
#define DAMPING_FACTOR_COLDER (CONFIG_DAMPING_FACTOR_COLDER * 0.00001f)
/**
* @brief Burner error state enumeration.
*/
typedef enum _BurnerErrorState
{
NO_ERROR, /**< No burner fault detected. */
FAULT /**< Burner fault signal active. */
} eBurnerErrorState;
/**
* @brief Measurement error state enumeration.
*/
typedef enum _MeasurementErrorState
{
MEASUREMENT_NO_ERROR, /**< Measurement valid. */
MEASUREMENT_FAULT /**< Measurement failed or sensor not found. */
} eMeasurementErrorState;
/**
* @brief Circular buffer for averaging temperature values.
*/
typedef struct _Average
{
float fValue; /**< Current average value. */
float samples[MAX(AVG10S_SAMPLE_SIZE, MAX(AVG60S_SAMPLE_SIZE, AVG24H_SAMPLE_SIZE))]; /**< Sample buffer. */
size_t bufferIndex; /**< Current write index. */
size_t bufferCount; /**< Number of valid samples. */
} sAverage;
/**
* @brief Circular buffer for temperature prediction.
*/
typedef struct _Predict
{
float fValue; /**< Predicted value. */
float samples[PRED60S_SAMPLE_SIZE]; /**< Sample buffer. */
size_t bufferIndex; /**< Current write index. */
size_t bufferCount; /**< Number of valid samples. */
} sPredict;
/**
* @brief Complete measurement data structure.
*/
typedef struct _Measurement
{
float fCurrentValue; /**< Current raw temperature value. */
float fDampedValue; /**< Damped temperature value. */
sAverage average10s; /**< 10-second rolling average. */
sAverage average60s; /**< 60-second rolling average. */
sPredict predict60s; /**< 60-second prediction. */
eMeasurementErrorState state; /**< Measurement state. */
} sMeasurement;
/**
* @brief Initialize the inputs module.
*
* Configures GPIO for burner fault input and starts the input task
* for reading DS18B20 temperature sensors.
*
* @return ESP_OK on success, ESP_FAIL on error.
*/
esp_err_t initInputs(void);
/**
* @brief Get the current chamber temperature measurement.
* @return sMeasurement structure with current values and state.
*/
sMeasurement getChamberTemperature(void);
/**
* @brief Get the current outdoor temperature measurement.
* @return sMeasurement structure with current values and state.
*/
sMeasurement getOutdoorTemperature(void);
/**
* @brief Get the current inlet flow temperature measurement.
* @return sMeasurement structure with current values and state.
*/
sMeasurement getInletFlowTemperature(void);
/**
* @brief Get the current return flow temperature measurement.
* @return sMeasurement structure with current values and state.
*/
sMeasurement getReturnFlowTemperature(void);
/**
* @brief Get the current burner error state.
* @return eBurnerErrorState indicating fault status.
*/
eBurnerErrorState getBurnerError(void);