174 lines
6.4 KiB
C++
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));
|
|
}
|
|
} |