Files
Sicherheitssystem/src/tasks.cpp
2025-07-20 18:26:24 +02:00

174 lines
6.4 KiB
C++

#include "Arduino.h"
#include "config.hpp"
#include "tasks.hpp"
#include "tlc.hpp"
#include "datatypes.hpp"
void displayWarning( void * params){
struct taskParams *myParams = (struct taskParams*)params;
Cockpit *cp = myParams->cockpit;
enum Alarm *alarm = myParams->alarmFired;
enum Alarm alarmStatebefore = NO_ALARM;
uint8_t alarmStateChanged = 0;
uint8_t statePreload = 0;
alarmStatebefore = *alarm;
while (true) {
if(*alarm != alarmStatebefore){
alarmStateChanged = 1;
}
else{
alarmStateChanged = 0;
}
switch (*alarm) {
case NO_ALARM:
vTaskDelay(100/portTICK_PERIOD_MS);
break;
case ALARM_100M:
if(alarmStateChanged){
alarmStatebefore = ALARM_100M;
statePreload = 30;
}
cp->flashing(Cockpit::WHITE, statePreload);
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
statePreload--;
if(statePreload == 0){
*alarm = NO_ALARM;
alarmStatebefore = NO_ALARM;
}
vTaskDelay(300/portTICK_PERIOD_MS);
break;
case ALARM_300M:
if(alarmStateChanged){
alarmStatebefore = ALARM_300M;
statePreload = 20;
}
cp->flashing(Cockpit::ORANGE, statePreload);
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
statePreload--;
if(statePreload == 0){
*alarm = NO_ALARM;
alarmStatebefore = NO_ALARM;
}
vTaskDelay(500/portTICK_PERIOD_MS);
break;
case ALARM_500M:
// Serial.print("Alarm 500");
if(alarmStateChanged){
alarmStatebefore = ALARM_500M;
statePreload = 20;
}
cp->flashing(Cockpit::GREEN, statePreload);
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
statePreload--;
if(statePreload == 0){
*alarm = NO_ALARM;
alarmStatebefore = NO_ALARM;
}
vTaskDelay(500/portTICK_PERIOD_MS);
break;
break;
case ALARM_1KM:
if(alarmStateChanged){
alarmStatebefore = ALARM_1KM;
statePreload = 20;
// statePreload = 120;
}
// cp->flashing(orange, statePreload);
// cp->colorfade(statePreload);
cp->flashing(Cockpit::BLUE, statePreload);
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
statePreload--;
if(statePreload == 0){
*alarm = NO_ALARM;
alarmStatebefore = NO_ALARM;
cp->turnOffLeds();
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
}
vTaskDelay(500/portTICK_PERIOD_MS);
break;
default:
vTaskDelay(1000/portTICK_PERIOD_MS);
}
// Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}
void dimmer(void * params){
struct taskParams *myParams = (struct taskParams*)params;
Cockpit *cp = myParams->cockpit;
enum Dimmer *dimmerState = myParams->dimmerState;
TaskHandle_t *thDisplayWarning = myParams->thDisplayWarning;
uint8_t brighterPressed = 0;
uint8_t darkerPressed = 0;
uint8_t ctrBrightnessChanged = 0;
while (1) {
if((gpio_get_level(BRIGHTER_PIN) == 0 && brighterPressed == 0) || *dimmerState == BRIGHTNESS_UP){
// brighter
brighterPressed = 1;
ctrBrightnessChanged = 10;
*dimmerState = NO_DIMMER;
if(eTaskGetState(*thDisplayWarning) != eTaskState::eDeleted){
vTaskSuspend(*thDisplayWarning);
}
cp->brightnessUp();
cp->displayBrightness();
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
}
if (gpio_get_level(BRIGHTER_PIN) == 1 && brighterPressed == 1) {
// brighter button released
brighterPressed = 0;
}
if((gpio_get_level(DARKER_PIN) == 0 && darkerPressed == 0) || *dimmerState == BRIGHTNESS_DOWN){
// darker
darkerPressed = 1;
ctrBrightnessChanged = 10;
*dimmerState = NO_DIMMER;
if(eTaskGetState(*thDisplayWarning) != eTaskState::eDeleted){
vTaskSuspend(*thDisplayWarning);
}
cp->brightnessDown();
cp->displayBrightness();
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
}
if (gpio_get_level(DARKER_PIN) == 1 && darkerPressed == 1) {
// darker button released
darkerPressed = 0;
}
vTaskDelay(100 / portTICK_PERIOD_MS);
if (ctrBrightnessChanged > 0){
ctrBrightnessChanged--;
if(ctrBrightnessChanged == 0){
// check if there are suspended tasks
if(eTaskGetState(*thDisplayWarning) == eTaskState::eSuspended){
cp->turnOffLeds();
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
vTaskResume(*thDisplayWarning);
}
else{
cp->turnOffLeds();
ESP_ERROR_CHECK(rmt_write_items(RMT_CHANNEL_0, cp->led_data, sizeof(cp->led_data) / sizeof(rmt_item32_t), true));
}
}
}
// Serial.println(uxTaskGetStackHighWaterMark(NULL));
}
}