/********************************* (C) РОТЕК *********************************** * @module led * @file led.c * @version 1.0.0 * @date XX.XX.XXXX * $brief Template ******************************************************************************* * @history Version Author Comment * XX.XX.XXXX 1.0.0 Telenkov D.A. First release. ******************************************************************************* */ #include "led.h" #include "megatec.h" #include "FreeRTOS.h" #include "task.h" #define LEDS_EXPAND_OFF(id, ...) \ LED_Off(id); #define LED_ALL_OFF() \ LEDS(LEDS_EXPAND_OFF) \ uint16_t statusLedFreq = 1000; // Определяет частоту мигания STATUS LED LED_STATE_t sLedInt = {GREEN, TOGGLE_OFF}; LED_STATE_t ledIntTemporary = {GREEN, TOGGLE_OFF}; /** * @brief * @retval */ void LED_Init(void) { LED_ALL_OFF(); } /** * @brief Задача простой мигалки */ void vTaskLedBlink(void *arg) { uint8_t start_status = 0; uint8_t start_status_old = 0; start_status = (UPS.Status >> 7) & 0x01; for (;;) { start_status = (UPS.Status >> 7) & 0x01; /* Просто отражает состояние контроллера - "живой" */ if ((UPS.Status >> 7) & 0x01) { if (start_status_old != start_status) { #ifdef LED_INIT_OK LED_Off(LED_INIT_OK); #endif } #ifdef LED_INIT_OK LED_Toggle(LED_INIT_OK); #endif #ifdef LED_INIT_ERR LED_Toggle(LED_INIT_ERR); #endif } else { if (start_status_old != start_status) { #ifdef LED_INIT_ERR LED_Off(LED_INIT_ERR); #endif } #ifdef LED_INIT_OK LED_Toggle(LED_INIT_OK); #endif } start_status_old = start_status; vTaskDelay(statusLedFreq); } } /** * @brief */ void LED_AddStateInt(COLOR_t color, TOGGLE_t toggle) { //sLedInt.toggle = toggle; if ((sLedInt.color == GREEN) && (toggle == TOGGLE_ON)) { sLedInt.toggle = toggle; } switch (color) { /* Зеленый не перебивает никакой цвет */ case GREEN : break; /* Красный перебивает все цвета и останавливет мигание*/ case RED : sLedInt.color = RED; sLedInt.toggle = TOGGLE_OFF; break; /* Желтый перебивает только зеленый и останавливает мигание*/ case YELLOW : if (sLedInt.color != RED) { sLedInt.color = YELLOW; sLedInt.toggle = TOGGLE_OFF; } break; default : break; } } /** * @brief */ void LED_On(gpio_t pin) { gpio_set(pin, 1); } /** * @brief */ void LED_Off(gpio_t pin) { gpio_set(pin, 0); } /** * @brief Изменить состояние LED */ void LED_Toggle(gpio_t pin) { gpio_invert_output(pin); } /** * @brief */ void LED_SetStatusLedFreq(uint16_t freq) { statusLedFreq = freq; } /********************************* (C) РОТЕК **********************************/