#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; }