led.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /********************************* (C) РОТЕК ***********************************
  2. * @module led
  3. * @file led.c
  4. * @version 1.0.0
  5. * @date XX.XX.XXXX
  6. * $brief Template
  7. *******************************************************************************
  8. * @history Version Author Comment
  9. * XX.XX.XXXX 1.0.0 Telenkov D.A. First release.
  10. *******************************************************************************
  11. */
  12. #include "gpio.h"
  13. #include "led.h"
  14. #include "FreeRTOS.h"
  15. #include "task.h"
  16. uint16_t statusLedFreq = 1000; // Определяет частоту мигания STATUS LED
  17. LED_t LED_GreenStatus;
  18. LED_t LED_RedStatus;
  19. LED_STATE_t sLedInt = {GREEN, TOGGLE_OFF};
  20. LED_STATE_t ledIntTemporary = {GREEN, TOGGLE_OFF};
  21. /**
  22. * @brief
  23. * @retval
  24. */
  25. void LED_Init(void)
  26. {
  27. LED_Off(GREEN_STATUS);
  28. LED_Off(RED_STATUS);
  29. }
  30. /**
  31. * @brief Задача простой мигалки
  32. */
  33. void vTaskLedBlink(void *pvParameters)
  34. {
  35. for (;;)
  36. {
  37. /* Просто отражает состояние контроллера - "живой" */
  38. LED_Toggle(GREEN_STATUS);
  39. vTaskDelay(statusLedFreq);
  40. }
  41. }
  42. /**
  43. * @brief
  44. */
  45. void LED_AddStateInt(COLOR_t color, TOGGLE_t toggle)
  46. {
  47. //sLedInt.toggle = toggle;
  48. if ((sLedInt.color == GREEN) && (toggle == TOGGLE_ON))
  49. sLedInt.toggle = toggle;
  50. switch (color)
  51. {
  52. /* Зеленый не перебивает никакой цвет */
  53. case GREEN :
  54. break;
  55. /* Красный перебивает все цвета и останавливет мигание*/
  56. case RED :
  57. sLedInt.color = RED;
  58. sLedInt.toggle = TOGGLE_OFF;
  59. break;
  60. /* Желтый перебивает только зеленый и останавливает мигание*/
  61. case YELLOW :
  62. if (sLedInt.color != RED)
  63. {
  64. sLedInt.color = YELLOW;
  65. sLedInt.toggle = TOGGLE_OFF;
  66. }
  67. break;
  68. default :
  69. break;
  70. }
  71. }
  72. /**
  73. * @brief
  74. */
  75. void LED_On(LED_NAMES_t led)
  76. {
  77. API_LED_On(LEDS[led].GPIOx, LEDS[led].GPIO_Pin, LEDS[led].revers);
  78. }
  79. /**
  80. * @brief
  81. */
  82. void LED_Off(LED_NAMES_t led)
  83. {
  84. API_LED_Off(LEDS[led].GPIOx, LEDS[led].GPIO_Pin, LEDS[led].revers);
  85. }
  86. /**
  87. * @brief Изменить состояние LED
  88. */
  89. void LED_Toggle(LED_NAMES_t led)
  90. {
  91. LEDS[led].GPIOx->ODR ^= LEDS[led].GPIO_Pin;
  92. }
  93. /**
  94. * @brief Включить LED
  95. * @param port
  96. * @param pin
  97. * @param revers: 0 - для включения LED нужно установить уровень
  98. * 1 - для включения LED нужно сбросить уровень
  99. * @retval
  100. */
  101. void API_LED_On(GPIO_TypeDef* port, uint16_t pin, uint8_t revers)
  102. {
  103. if (revers == 0)
  104. port->BSRRL = pin;
  105. else
  106. port->BSRRH = pin;
  107. }
  108. /**
  109. * @brief Выключить LED
  110. * @param port
  111. * @param pin
  112. * @param revers: 0 - для выключения LED нужно снять уровень
  113. * 1 - для выключения LED нужно установить уровень
  114. * @retval
  115. */
  116. void API_LED_Off(GPIO_TypeDef* port, uint16_t pin, uint8_t revers)
  117. {
  118. if (revers == 0)
  119. port->BSRRH = pin;
  120. else
  121. port->BSRRL = pin;
  122. }
  123. /**
  124. * @brief
  125. */
  126. void LED_SetStatusLedFreq(uint16_t freq)
  127. {
  128. statusLedFreq = freq;
  129. }
  130. /********************************* (C) РОТЕК **********************************/