/********************************* (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 "gpio.h" #include "led.h" #include "FreeRTOS.h" #include "task.h" uint16_t statusLedFreq = 1000; // Определяет частоту мигания STATUS LED LED_t LED_GreenStatus; LED_t LED_RedStatus; LED_STATE_t sLedInt = {GREEN, TOGGLE_OFF}; LED_STATE_t ledIntTemporary = {GREEN, TOGGLE_OFF}; /** * @brief * @retval */ void LED_Init(void) { LED_Off(GREEN_STATUS); LED_Off(RED_STATUS); } /** * @brief Задача простой мигалки */ void vTaskLedBlink(void *pvParameters) { for (;;) { /* Просто отражает состояние контроллера - "живой" */ LED_Toggle(GREEN_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(LED_NAMES_t led) { API_LED_On(LEDS[led].GPIOx, LEDS[led].GPIO_Pin, LEDS[led].revers); } /** * @brief */ void LED_Off(LED_NAMES_t led) { API_LED_Off(LEDS[led].GPIOx, LEDS[led].GPIO_Pin, LEDS[led].revers); } /** * @brief Изменить состояние LED */ void LED_Toggle(LED_NAMES_t led) { LEDS[led].GPIOx->ODR ^= LEDS[led].GPIO_Pin; } /** * @brief Включить LED * @param port * @param pin * @param revers: 0 - для включения LED нужно установить уровень * 1 - для включения LED нужно сбросить уровень * @retval */ void API_LED_On(GPIO_TypeDef* port, uint16_t pin, uint8_t revers) { if (revers == 0) port->BSRRL = pin; else port->BSRRH = pin; } /** * @brief Выключить LED * @param port * @param pin * @param revers: 0 - для выключения LED нужно снять уровень * 1 - для выключения LED нужно установить уровень * @retval */ void API_LED_Off(GPIO_TypeDef* port, uint16_t pin, uint8_t revers) { if (revers == 0) port->BSRRH = pin; else port->BSRRL = pin; } /** * @brief */ void LED_SetStatusLedFreq(uint16_t freq) { statusLedFreq = freq; } /********************************* (C) РОТЕК **********************************/