From 97956882dd508b8b55e7b9c498fba4fabef5eba48c1054cbb151a6c0ed70d527 Mon Sep 17 00:00:00 2001 From: localhorst Date: Wed, 11 Dec 2024 22:03:49 +0100 Subject: [PATCH] started safety --- .vscode/settings.json | 4 +- README.md | 5 +- main/main.c | 4 +- main/safety.c | 108 ++++++++++++++++++++++++++++++++++++++++++ main/safety.h | 14 ++++++ 5 files changed, 131 insertions(+), 4 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 9d34cbf..7f9cc3f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,9 @@ "metrics.h": "c", "freertos.h": "c", "compare": "c", - "inputs.h": "c" + "inputs.h": "c", + "cstdlib": "c", + "typeinfo": "c" }, "idf.openOcdConfigs": [ "board/esp32-wrover-kit-3.3v.cfg" diff --git a/README.md b/README.md index 30bd38a..58e87ee 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,9 @@ Safety <|-- HTTP_Metrics } class Safety{ - +taskSafety() - +setSafeState() + +initSafety() + -taskSafety() + -setSafeState() -checkSensorSanity() +getSafetyState() } diff --git a/main/main.c b/main/main.c index ed69816..e136b16 100644 --- a/main/main.c +++ b/main/main.c @@ -12,6 +12,7 @@ #include "freertos/timers.h" #include "nvs_flash.h" +#include "safety.h" #include "metrics.h" #include "outputs.h" #include "inputs.h" @@ -34,9 +35,10 @@ void app_main(void) } ESP_ERROR_CHECK(ret); - initMetrics(); initOutputs(); initInputs(); + initSafety(); + initMetrics(); /*TODO: will be done by safety on the future*/ setCirculationPumpState(DISABLED); diff --git a/main/safety.c b/main/safety.c index 473a0f4..7e19f73 100644 --- a/main/safety.c +++ b/main/safety.c @@ -0,0 +1,108 @@ +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "safety.h" +#include "outputs.h" +#include "inputs.h" + +#define PERIODIC_INTERVAL 1U // run safety checks every 1sec + +typedef struct _TemperatureSensorLimit +{ + float max; // Maximum temperature limit + float min; // Minimum temperature limit +} sTemperatureSensorLimit; + +static const char *TAG = "smart-oil-heater-control-system-safety"; +static SemaphoreHandle_t xMutexAccessSafety = NULL; +sSafetyStateElement safetyStates[NUMBER_OF_ERROR_STATES] = { + {0, "Emergency Stop"}, + {0, "Safety Door Open"}, + {0, "Overheating"}, + {0, "Low Battery"}}; + +static const sTemperatureSensorLimit sChamperTemperatureLimit = {75.0f, 15.0f}; + +void taskSafety(void *pvParameters); +void checkSensorSanity(void); +void setSafeState(void); + +void initSafety(void) +{ + xMutexAccessSafety = xSemaphoreCreateBinary(); + if (xMutexAccessSafety == NULL) + { + ESP_LOGE(TAG, "Unable to create mutex"); + } + xSemaphoreGive(xMutexAccessSafety); + + BaseType_t taskCreated = xTaskCreate( + taskSafety, // Function to implement the task + "taskSafety", // Task name + 2048, // 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 taskSafety(void *pvParameters) +{ + while (1) + { + vTaskDelay(PERIODIC_INTERVAL * 1000U / portTICK_PERIOD_MS); + + checkSensorSanity(); + } +} + +void checkSensorSanity(void) +{ + static float fChamperTemperatureLast; + static float fOutdoorTemperatureLast; + static float fInletFlowTemperatureLast; + static float fReturnFlowTemperatureLast; + + const float fChamperTemperatureCurrent = getChamberTemperature(CURRENT); + if (fChamperTemperatureCurrent == fChamperTemperatureLast) + { + ESP_LOGE(TAG, "Champer Temperature Sensor reported unchanged value!"); + } + else + { + fChamperTemperatureLast = fChamperTemperatureCurrent; + + if (fChamperTemperatureCurrent > sChamperTemperatureLimit.max) + { + ESP_LOGE(TAG, "Champer Temperature Sensor reported too high value!"); + } + else if (fChamperTemperatureCurrent < sChamperTemperatureLimit.min) + { + ESP_LOGE(TAG, "Champer Temperature Sensor reported too low value!"); + } + else + { + // everything ok + } + } +} + +void setSafeState(void) +{ + setCirculationPumpState(DISABLED); + setBurnerState(DISABLED); +} + +sSafetyStateElement *getSafetyStates(void) +{ + return safetyStates; +} \ No newline at end of file diff --git a/main/safety.h b/main/safety.h index 473a0f4..634b614 100644 --- a/main/safety.h +++ b/main/safety.h @@ -0,0 +1,14 @@ +#pragma once + + +#define MAX_ERROR_STRING_SIZE 64U +#define NUMBER_OF_ERROR_STATES 4U + +typedef struct _SafetyStateElement{ +unsigned int status; +char name[MAX_ERROR_STRING_SIZE]; +} sSafetyStateElement; + +void initSafety(void); + +sSafetyStateElement* getSafetyStates(void); \ No newline at end of file