diff --git a/main/inputs.c b/main/inputs.c index 943c910..a4dc2ee 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -1,6 +1,7 @@ #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" +#include #include "esp_log.h" #include @@ -31,6 +32,7 @@ static sMeasurement sInletFlowTemperature; static sMeasurement sReturnFlowTemperature; void taskInput(void *pvParameters); +void initMeasurement(sMeasurement *pMeasurement); void updateAverage(sMeasurement *pMeasurement); void updatePrediction(sMeasurement *pMeasurement); @@ -54,6 +56,11 @@ void initInputs(void) } xSemaphoreGiveRecursive(xMutexAccessInputs); + initMeasurement(&sChamperTemperature); + initMeasurement(&sOutdoorTemperature); + initMeasurement(&sInletFlowTemperature); + initMeasurement(&sReturnFlowTemperature); + BaseType_t taskCreated = xTaskCreate( taskInput, // Function to implement the task "taskInput", // Task name @@ -73,6 +80,32 @@ void initInputs(void) } } +void initMeasurement(sMeasurement *pMeasurement) +{ + pMeasurement->state = MEASUREMENT_FAULT; + pMeasurement->fCurrentValue = 0.0f; + + pMeasurement->average10s.fValue = 0.0f; + pMeasurement->average10s.bufferCount = 0U; + pMeasurement->average10s.bufferIndex = 0U; + memset(pMeasurement->average10s.samples, 0U, AVG10_SAMPLE_SIZE); + + pMeasurement->average60s.fValue = 0.0f; + pMeasurement->average60s.bufferCount = 0U; + pMeasurement->average60s.bufferIndex = 0U; + memset(pMeasurement->average60s.samples, 0U, AVG60_SAMPLE_SIZE); + + pMeasurement->predict10s.fValue = 0.0f; + pMeasurement->predict10s.bufferCount = 0U; + pMeasurement->predict10s.bufferIndex = 0U; + memset(pMeasurement->predict10s.samples, 0U, PRED10_SAMPLE_SIZE); + + pMeasurement->predict60s.fValue = 0.0f; + pMeasurement->predict60s.bufferCount = 0U; + pMeasurement->predict60s.bufferIndex = 0U; + memset(pMeasurement->predict60s.samples, 0U, PRED60_SAMPLE_SIZE); +} + void updateAverage(sMeasurement *pMeasurement) { /* Average form the last 10sec */ pMeasurement->average10s.samples[pMeasurement->average10s.bufferIndex] = pMeasurement->fCurrentValue; @@ -124,10 +157,25 @@ void updatePrediction(sMeasurement *pMeasurement) pMeasurement->predict10s.bufferCount++; } - float delta = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; - if (delta != 0.0) + float delta10s = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; + if (delta10s != 0.0) { - pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta * pMeasurement->predict10s.bufferCount); + pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta10s * pMeasurement->predict10s.bufferCount); + } + + /* Prediction of the value in 60sec */ + pMeasurement->predict60s.samples[pMeasurement->predict60s.bufferIndex] = pMeasurement->fCurrentValue; + pMeasurement->predict60s.bufferIndex = (pMeasurement->predict60s.bufferIndex + 1) % PRED60_SAMPLE_SIZE; + + if (pMeasurement->predict60s.bufferCount < PRED60_SAMPLE_SIZE) + { + pMeasurement->predict60s.bufferCount++; + } + + float delta60s = pMeasurement->predict60s.samples[(pMeasurement->predict60s.bufferIndex - 1) % PRED60_SAMPLE_SIZE] - pMeasurement->predict60s.samples[pMeasurement->predict60s.bufferIndex]; + if (delta60s != 0.0) + { + pMeasurement->predict60s.fValue = pMeasurement->fCurrentValue + (delta60s * pMeasurement->predict60s.bufferCount); } }