94 lines
3.6 KiB
C
94 lines
3.6 KiB
C
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
#include "esp_log.h"
|
|
#include "control.h"
|
|
#include "outputs.h"
|
|
#include "inputs.h"
|
|
#include "safety.h"
|
|
#include "sntp.h"
|
|
|
|
#define PERIODIC_INTERVAL 1U // run control loop every 1sec
|
|
|
|
#define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY 30.0
|
|
#define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT 20.0
|
|
#define CHAMPER_TEMPERATURE_TARGET 70.0
|
|
|
|
static const char *TAG = "smart-oil-heater-control-system-control";
|
|
static eControlState sControlState = CONTROL_STARTING;
|
|
|
|
static sControlDay aControlTable[] = {
|
|
{MONDAY, 2U, {{{4, 45}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMPER_TEMPERATURE_TARGET}, {{22, 0}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMPER_TEMPERATURE_TARGET}}},
|
|
{TUESDAY, 2U, {{{4, 45}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMPER_TEMPERATURE_TARGET}, {{22, 0}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMPER_TEMPERATURE_TARGET}}},
|
|
{WEDNESDAY, 2U, {{{4, 45}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMPER_TEMPERATURE_TARGET}, {{22, 0}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMPER_TEMPERATURE_TARGET}}},
|
|
{THURSDAY, 2U, {{{4, 45}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMPER_TEMPERATURE_TARGET}, {{22, 0}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMPER_TEMPERATURE_TARGET}}},
|
|
{FRIDAY, 2U, {{{4, 45}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMPER_TEMPERATURE_TARGET}, {{23, 0}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMPER_TEMPERATURE_TARGET}}},
|
|
{SATURDAY, 2U, {{{6, 45}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMPER_TEMPERATURE_TARGET}, {{23, 30}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMPER_TEMPERATURE_TARGET}}},
|
|
{SUNDAY, 2U, {{{6, 45}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMPER_TEMPERATURE_TARGET}, {{22, 30}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMPER_TEMPERATURE_TARGET}}},
|
|
};
|
|
|
|
void taskControl(void *pvParameters);
|
|
|
|
void initControl(void)
|
|
{
|
|
BaseType_t taskCreated = xTaskCreate(
|
|
taskControl, // Function to implement the task
|
|
"taskControl", // Task name
|
|
4096, // Stack size (in words, not bytes)
|
|
NULL, // Parameters to the task function (none in this case)
|
|
5, // Task priority (higher number = higher priority)
|
|
NULL // Task handle (optional)
|
|
);
|
|
|
|
if (taskCreated == pdPASS)
|
|
{
|
|
ESP_LOGI(TAG, "Task created successfully!");
|
|
}
|
|
else
|
|
{
|
|
ESP_LOGE(TAG, "Failed to create task");
|
|
}
|
|
}
|
|
|
|
void taskControl(void *pvParameters)
|
|
{
|
|
while (1)
|
|
{
|
|
vTaskDelay(PERIODIC_INTERVAL * 1000U / portTICK_PERIOD_MS);
|
|
|
|
if (getSafetyState() != SAFETY_NO_ERROR)
|
|
{
|
|
ESP_LOGW(TAG, "Control not possible due to safety fault!");
|
|
sControlState = CONTROL_FAULT;
|
|
continue;
|
|
}
|
|
|
|
if (getSntpState() != SYNC_SUCCESSFUL)
|
|
{
|
|
ESP_LOGW(TAG, "Control not possible due to sntp fault!");
|
|
sControlState = CONTROL_FAULT;
|
|
continue;
|
|
}
|
|
|
|
// TODO: control the burner based on controltable
|
|
setCirculationPumpState(DISABLED);
|
|
setBurnerState(ENABLED);
|
|
setSafetyControlState(ENABLED);
|
|
|
|
int numberOfDays = sizeof(aControlTable) / sizeof(aControlTable[0]);
|
|
ESP_LOGI(TAG, "Number of days: %i", numberOfDays);
|
|
|
|
for (int i = 0; i < numberOfDays; i++)
|
|
{
|
|
ESP_LOGI(TAG, "Day %d: %d", i + 1, aControlTable[i].day);
|
|
|
|
int numberOfEntries = aControlTable[i].entryCount;
|
|
ESP_LOGI(TAG, "Number of entries: %i", numberOfEntries);
|
|
}
|
|
}
|
|
}
|
|
|
|
eControlState getControlState(void)
|
|
{
|
|
return sControlState;
|
|
}
|