led.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 "led.h"
  13. #include "megatec.h"
  14. #include "FreeRTOS.h"
  15. #include "task.h"
  16. #define LEDS_EXPAND_OFF(id, ...) \
  17. LED_Off(id);
  18. #define LED_ALL_OFF() \
  19. LEDS(LEDS_EXPAND_OFF) \
  20. uint16_t statusLedFreq = 1000; // Определяет частоту мигания STATUS LED
  21. LED_STATE_t sLedInt = {GREEN, TOGGLE_OFF};
  22. LED_STATE_t ledIntTemporary = {GREEN, TOGGLE_OFF};
  23. /**
  24. * @brief
  25. * @retval
  26. */
  27. void LED_Init(void)
  28. {
  29. LED_ALL_OFF();
  30. }
  31. /**
  32. * @brief Задача простой мигалки
  33. */
  34. void vTaskLedBlink(void *arg)
  35. {
  36. uint8_t start_status = 0;
  37. uint8_t start_status_old = 0;
  38. start_status = (UPS.Status >> 7) & 0x01;
  39. for (;;) {
  40. start_status = (UPS.Status >> 7) & 0x01;
  41. /* Просто отражает состояние контроллера - "живой" */
  42. if ((UPS.Status >> 7) & 0x01) {
  43. if (start_status_old != start_status) {
  44. #ifdef LED_INIT_OK
  45. LED_Off(LED_INIT_OK);
  46. #endif
  47. }
  48. #ifdef LED_INIT_OK
  49. LED_Toggle(LED_INIT_OK);
  50. #endif
  51. #ifdef LED_INIT_ERR
  52. LED_Toggle(LED_INIT_ERR);
  53. #endif
  54. } else {
  55. if (start_status_old != start_status) {
  56. #ifdef LED_INIT_ERR
  57. LED_Off(LED_INIT_ERR);
  58. #endif
  59. }
  60. #ifdef LED_INIT_OK
  61. LED_Toggle(LED_INIT_OK);
  62. #endif
  63. }
  64. start_status_old = start_status;
  65. vTaskDelay(statusLedFreq);
  66. }
  67. }
  68. /**
  69. * @brief
  70. */
  71. void LED_AddStateInt(COLOR_t color, TOGGLE_t toggle)
  72. {
  73. //sLedInt.toggle = toggle;
  74. if ((sLedInt.color == GREEN) && (toggle == TOGGLE_ON)) {
  75. sLedInt.toggle = toggle;
  76. }
  77. switch (color) {
  78. /* Зеленый не перебивает никакой цвет */
  79. case GREEN :
  80. break;
  81. /* Красный перебивает все цвета и останавливет мигание*/
  82. case RED :
  83. sLedInt.color = RED;
  84. sLedInt.toggle = TOGGLE_OFF;
  85. break;
  86. /* Желтый перебивает только зеленый и останавливает мигание*/
  87. case YELLOW :
  88. if (sLedInt.color != RED) {
  89. sLedInt.color = YELLOW;
  90. sLedInt.toggle = TOGGLE_OFF;
  91. }
  92. break;
  93. default :
  94. break;
  95. }
  96. }
  97. /**
  98. * @brief
  99. */
  100. void LED_On(gpio_t pin)
  101. {
  102. gpio_set(pin, 1);
  103. }
  104. /**
  105. * @brief
  106. */
  107. void LED_Off(gpio_t pin)
  108. {
  109. gpio_set(pin, 0);
  110. }
  111. /**
  112. * @brief Изменить состояние LED
  113. */
  114. void LED_Toggle(gpio_t pin)
  115. {
  116. gpio_invert_output(pin);
  117. }
  118. /**
  119. * @brief
  120. */
  121. void LED_SetStatusLedFreq(uint16_t freq)
  122. {
  123. statusLedFreq = freq;
  124. }
  125. /********************************* (C) РОТЕК **********************************/