formatting

This commit is contained in:
2025-11-01 17:46:33 +01:00
parent d992218a7d
commit b6150ad452

View File

@ -92,7 +92,8 @@ static sControlTemperatureEntry currentControlEntry =
void taskControl(void *pvParameters); void taskControl(void *pvParameters);
void findControlCurrentTemperatureEntry(void); void findControlCurrentTemperatureEntry(void);
void initControl(void) { void initControl(void)
{
BaseType_t taskCreated = BaseType_t taskCreated =
xTaskCreate(taskControl, // Function to implement the task xTaskCreate(taskControl, // Function to implement the task
"taskControl", // Task name "taskControl", // Task name
@ -102,27 +103,34 @@ void initControl(void) {
NULL // Task handle (optional) NULL // Task handle (optional)
); );
if (taskCreated == pdPASS) { if (taskCreated == pdPASS)
{
ESP_LOGI(TAG, "Task created successfully!"); ESP_LOGI(TAG, "Task created successfully!");
} else { }
else
{
ESP_LOGE(TAG, "Failed to create task"); ESP_LOGE(TAG, "Failed to create task");
} }
} }
void taskControl(void *pvParameters) { void taskControl(void *pvParameters)
{
bool bHeatingInAction = false; bool bHeatingInAction = false;
bool bSummerMode = false; bool bSummerMode = false;
eBurnerState eBurnerState = BURNER_UNKNOWN; eBurnerState eBurnerState = BURNER_UNKNOWN;
int64_t i64BurnerEnableTimestamp = esp_timer_get_time(); int64_t i64BurnerEnableTimestamp = esp_timer_get_time();
while (1) { while (1)
{
vTaskDelay(PERIODIC_INTERVAL * 1000U / portTICK_PERIOD_MS); vTaskDelay(PERIODIC_INTERVAL * 1000U / portTICK_PERIOD_MS);
// Check for safety faults // Check for safety faults
if (getSafetyState() != SAFETY_NO_ERROR) { if (getSafetyState() != SAFETY_NO_ERROR)
{
ESP_LOGW(TAG, "Control not possible due to safety fault!"); ESP_LOGW(TAG, "Control not possible due to safety fault!");
sControlState = CONTROL_FAULT_SAFETY; sControlState = CONTROL_FAULT_SAFETY;
if (bHeatingInAction) { if (bHeatingInAction)
{
ESP_LOGW(TAG, "Disabling burner due to safety fault"); ESP_LOGW(TAG, "Disabling burner due to safety fault");
bHeatingInAction = false; bHeatingInAction = false;
setBurnerState(DISABLED); setBurnerState(DISABLED);
@ -132,10 +140,12 @@ void taskControl(void *pvParameters) {
} }
// Check for SNTP faults // Check for SNTP faults
if (getSntpState() != SYNC_SUCCESSFUL) { if (getSntpState() != SYNC_SUCCESSFUL)
{
ESP_LOGW(TAG, "Control not possible due to SNTP fault!"); ESP_LOGW(TAG, "Control not possible due to SNTP fault!");
sControlState = CONTROL_FAULT_SNTP; sControlState = CONTROL_FAULT_SNTP;
if (bHeatingInAction) { if (bHeatingInAction)
{
ESP_LOGW(TAG, "Disabling burner due to SNTP fault"); ESP_LOGW(TAG, "Disabling burner due to SNTP fault");
bHeatingInAction = false; bHeatingInAction = false;
setBurnerState(DISABLED); setBurnerState(DISABLED);
@ -149,25 +159,32 @@ void taskControl(void *pvParameters) {
getControlCurrentTemperatureEntry(); getControlCurrentTemperatureEntry();
if (getOutdoorTemperature().fDampedValue >= if (getOutdoorTemperature().fDampedValue >=
SUMMER_MODE_TEMPERATURE_THRESHOLD_HIGH) { SUMMER_MODE_TEMPERATURE_THRESHOLD_HIGH)
{
bSummerMode = true; bSummerMode = true;
} else if (getOutdoorTemperature().fDampedValue <= }
SUMMER_MODE_TEMPERATURE_THRESHOLD_LOW) { else if (getOutdoorTemperature().fDampedValue <=
SUMMER_MODE_TEMPERATURE_THRESHOLD_LOW)
{
bSummerMode = false; bSummerMode = false;
} }
// Enable burner if outdoor temperature is low and return flow temperature // Enable burner if outdoor temperature is low and return flow temperature
// is cooled down // is cooled down
if (!bHeatingInAction && (eBurnerState != BURNER_FAULT)) { if (!bHeatingInAction && (eBurnerState != BURNER_FAULT))
if (bSummerMode) { {
if (bSummerMode)
{
// ESP_LOGI(TAG, "Outdoor temperature too warm: Disabling heating"); // ESP_LOGI(TAG, "Outdoor temperature too warm: Disabling heating");
setBurnerState(DISABLED); setBurnerState(DISABLED);
setSafetyControlState(DISABLED); setSafetyControlState(DISABLED);
sControlState = CONTROL_OUTDOOR_TOO_WARM; sControlState = CONTROL_OUTDOOR_TOO_WARM;
} else if ((getReturnFlowTemperature().average60s.fValue <= }
else if ((getReturnFlowTemperature().average60s.fValue <=
currentControlEntry.fReturnFlowTemperature) && currentControlEntry.fReturnFlowTemperature) &&
(getChamberTemperature().fCurrentValue <= (getChamberTemperature().fCurrentValue <=
CHAMBER_TEMPERATURE_THRESHOLD)) { CHAMBER_TEMPERATURE_THRESHOLD))
{
ESP_LOGI(TAG, ESP_LOGI(TAG,
"Enabling burner: Return flow temperature target reached"); "Enabling burner: Return flow temperature target reached");
eBurnerState = BURNER_UNKNOWN; eBurnerState = BURNER_UNKNOWN;
@ -176,33 +193,43 @@ void taskControl(void *pvParameters) {
setSafetyControlState(ENABLED); setSafetyControlState(ENABLED);
i64BurnerEnableTimestamp = esp_timer_get_time(); i64BurnerEnableTimestamp = esp_timer_get_time();
sControlState = CONTROL_HEATING; sControlState = CONTROL_HEATING;
} else { }
else
{
// ESP_LOGI(TAG, "Return flow temperature too warm: Disabling heating"); // ESP_LOGI(TAG, "Return flow temperature too warm: Disabling heating");
sControlState = CONTROL_RETURN_FLOW_TOO_WARM; sControlState = CONTROL_RETURN_FLOW_TOO_WARM;
} }
} }
// Disable burner if target temperature is reached or a fault occurred // Disable burner if target temperature is reached or a fault occurred
if (bHeatingInAction) { if (bHeatingInAction)
{
if ((getChamberTemperature().fCurrentValue >= if ((getChamberTemperature().fCurrentValue >=
currentControlEntry.fChamberTemperature) || currentControlEntry.fChamberTemperature) ||
(getChamberTemperature().predict60s.fValue >= (getChamberTemperature().predict60s.fValue >=
currentControlEntry.fChamberTemperature)) { currentControlEntry.fChamberTemperature))
{
ESP_LOGI(TAG, "Chamber target temperature reached: Disabling burner"); ESP_LOGI(TAG, "Chamber target temperature reached: Disabling burner");
bHeatingInAction = false; bHeatingInAction = false;
setBurnerState(DISABLED); setBurnerState(DISABLED);
setSafetyControlState(ENABLED); setSafetyControlState(ENABLED);
} else if (esp_timer_get_time() - i64BurnerEnableTimestamp >= }
BURNER_FAULT_DETECTION_THRESHOLD * 1000000U) { else if (esp_timer_get_time() - i64BurnerEnableTimestamp >=
if (eBurnerState == BURNER_UNKNOWN) { BURNER_FAULT_DETECTION_THRESHOLD * 1000000U)
if (getBurnerError() == FAULT) { {
if (eBurnerState == BURNER_UNKNOWN)
{
if (getBurnerError() == FAULT)
{
// ESP_LOGW(TAG, "Burner fault detected: Disabling burner"); // ESP_LOGW(TAG, "Burner fault detected: Disabling burner");
bHeatingInAction = false; bHeatingInAction = false;
eBurnerState = BURNER_FAULT; eBurnerState = BURNER_FAULT;
sControlState = CONTROL_FAULT_BURNER; sControlState = CONTROL_FAULT_BURNER;
setBurnerState(DISABLED); setBurnerState(DISABLED);
setSafetyControlState(ENABLED); setSafetyControlState(ENABLED);
} else { }
else
{
// ESP_LOGI(TAG, "No burner fault detected: Marking burner as // ESP_LOGI(TAG, "No burner fault detected: Marking burner as
// fired"); // fired");
eBurnerState = BURNER_FIRED; eBurnerState = BURNER_FIRED;
@ -213,10 +240,13 @@ void taskControl(void *pvParameters) {
// Manage circulation pump // Manage circulation pump
if (getChamberTemperature().fCurrentValue <= if (getChamberTemperature().fCurrentValue <=
CIRCULATION_PUMP_TEMPERATURE_THRESHOLD) { CIRCULATION_PUMP_TEMPERATURE_THRESHOLD)
{
// ESP_LOGI(TAG, "Burner cooled down: Disabling circulation pump"); // ESP_LOGI(TAG, "Burner cooled down: Disabling circulation pump");
setCirculationPumpState(DISABLED); setCirculationPumpState(DISABLED);
} else { }
else
{
// ESP_LOGI(TAG, "Burner heated: Enabling circulation pump"); // ESP_LOGI(TAG, "Burner heated: Enabling circulation pump");
setCirculationPumpState(ENABLED); setCirculationPumpState(ENABLED);
} }
@ -225,7 +255,8 @@ void taskControl(void *pvParameters) {
eControlState getControlState(void) { return sControlState; } eControlState getControlState(void) { return sControlState; }
eControlWeekday getControlCurrentWeekday(void) { eControlWeekday getControlCurrentWeekday(void)
{
time_t now; time_t now;
struct tm *timeinfo; struct tm *timeinfo;
@ -250,7 +281,8 @@ eControlWeekday getControlCurrentWeekday(void) {
* that should be active at the current date/time. Falls back to the * that should be active at the current date/time. Falls back to the
* last entry in the week if no suitable entry is found. * last entry in the week if no suitable entry is found.
*/ */
void findControlCurrentTemperatureEntry(void) { void findControlCurrentTemperatureEntry(void)
{
eControlWeekday currentDay = getControlCurrentWeekday(); eControlWeekday currentDay = getControlCurrentWeekday();
// Get current time // Get current time
@ -265,10 +297,12 @@ void findControlCurrentTemperatureEntry(void) {
// ESP_LOGI(TAG, "Searching for control entry - Day: %d, Time: %02d:%02d", currentDay, currentHour, currentMinute); // ESP_LOGI(TAG, "Searching for control entry - Day: %d, Time: %02d:%02d", currentDay, currentHour, currentMinute);
// Search through all days and entries // Search through all days and entries
for (int dayIndex = 0; dayIndex < 7; dayIndex++) { for (int dayIndex = 0; dayIndex < 7; dayIndex++)
{
const sControlDay *day = &aControlTable[dayIndex]; const sControlDay *day = &aControlTable[dayIndex];
for (int entryIndex = 0; entryIndex < day->entryCount; entryIndex++) { for (int entryIndex = 0; entryIndex < day->entryCount; entryIndex++)
{
const sControlTemperatureEntry *entry = &day->aTemperatureEntries[entryIndex]; const sControlTemperatureEntry *entry = &day->aTemperatureEntries[entryIndex];
// Check if this entry is in the future (next active entry) // Check if this entry is in the future (next active entry)
@ -278,16 +312,22 @@ void findControlCurrentTemperatureEntry(void) {
(entry->timestamp.hour == currentHour && (entry->timestamp.hour == currentHour &&
entry->timestamp.minute > currentMinute)); entry->timestamp.minute > currentMinute));
if (isFutureDay || isTodayFutureTime) { if (isFutureDay || isTodayFutureTime)
{
// Found next scheduled entry, so determine the previous (active) one // Found next scheduled entry, so determine the previous (active) one
if (entryIndex > 0) { if (entryIndex > 0)
{
// Use previous entry from same day // Use previous entry from same day
currentControlEntry = day->aTemperatureEntries[entryIndex - 1]; currentControlEntry = day->aTemperatureEntries[entryIndex - 1];
} else if (dayIndex > 0) { }
else if (dayIndex > 0)
{
// Use last entry from previous day // Use last entry from previous day
const sControlDay *previousDay = &aControlTable[dayIndex - 1]; const sControlDay *previousDay = &aControlTable[dayIndex - 1];
currentControlEntry = previousDay->aTemperatureEntries[previousDay->entryCount - 1]; currentControlEntry = previousDay->aTemperatureEntries[previousDay->entryCount - 1];
} else { }
else
{
// First entry of the week - wrap to last entry of Sunday // First entry of the week - wrap to last entry of Sunday
const sControlDay *sunday = &aControlTable[6]; const sControlDay *sunday = &aControlTable[6];
currentControlEntry = sunday->aTemperatureEntries[sunday->entryCount - 1]; currentControlEntry = sunday->aTemperatureEntries[sunday->entryCount - 1];
@ -310,11 +350,10 @@ void findControlCurrentTemperatureEntry(void) {
const sControlDay *sunday = &aControlTable[6]; const sControlDay *sunday = &aControlTable[6];
currentControlEntry = sunday->aTemperatureEntries[sunday->entryCount - 1]; currentControlEntry = sunday->aTemperatureEntries[sunday->entryCount - 1];
ESP_LOGI(TAG, "Using last entry of week - Time: %02d:%02d", // ESP_LOGI(TAG, "Using last entry of week - Time: %02d:%02d", currentControlEntry.timestamp.hour, currentControlEntry.timestamp.minute);
currentControlEntry.timestamp.hour,
currentControlEntry.timestamp.minute);
} }
sControlTemperatureEntry getControlCurrentTemperatureEntry(void) { sControlTemperatureEntry getControlCurrentTemperatureEntry(void)
{
return currentControlEntry; return currentControlEntry;
} }