led.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include "main.h"
  2. #include "led.h"
  3. // 定义两个灯的控制器
  4. //LEDControl_t led_green = {GPIOB, LED_GREEN_Pin, 1000, 0, 1}; // 默认1秒闪一次
  5. //LEDControl_t led_red = {GPIOB, LED_RED_Pin, 0, 0, 0}; // 默认不闪
  6. LEDControl_t led_red = {
  7. .GPIOx = LED1_R_GPIO_PORT,
  8. .GPIO_Pin = LED1_R_PIN,
  9. .enabled = 0,
  10. .flash_interval_ms = 0,
  11. .counter = 0,
  12. .flash_times = 0,
  13. .current_flash_count = 0,
  14. .flash_pause_ms = 0,
  15. .pause_counter = 0,
  16. .in_pause = 0,
  17. .pin_state = 0
  18. };
  19. LEDControl_t led_green = {
  20. .GPIOx = LED1_R_GPIO_PORT,
  21. .GPIO_Pin = LED1_G_PIN,
  22. .enabled = 0,
  23. .flash_interval_ms = 0,
  24. .counter = 0,
  25. .flash_times = 0,
  26. .current_flash_count = 0,
  27. .flash_pause_ms = 0,
  28. .pause_counter = 0,
  29. .in_pause = 0,
  30. .pin_state = 0
  31. };
  32. // 每个灯的闪烁处理函数,同一个灯两颜色互斥
  33. void LED_FlashHandler(LEDControl_t* led_self, LEDControl_t* led_other)
  34. {
  35. if (!led_self->enabled || led_self->flash_interval_ms == 0)
  36. return;
  37. led_self->counter += 10;
  38. if (led_self->in_pause)
  39. {
  40. if (led_self->counter >= led_self->flash_pause_ms)
  41. {
  42. led_self->counter = 0;
  43. led_self->current_flash_count = 0;
  44. led_self->in_pause = 0;
  45. led_self->pin_state = 0;
  46. HAL_GPIO_WritePin(led_self->GPIOx, led_self->GPIO_Pin, GPIO_PIN_RESET);
  47. }
  48. return;
  49. }
  50. if (led_self->counter >= led_self->flash_interval_ms)
  51. {
  52. led_self->counter = 0;
  53. led_self->pin_state = !led_self->pin_state;
  54. if (led_self->pin_state)
  55. {
  56. // 点亮自己前,先熄灭对方,保持双色灯互斥
  57. HAL_GPIO_WritePin(led_other->GPIOx, led_other->GPIO_Pin, GPIO_PIN_RESET);
  58. HAL_GPIO_WritePin(led_self->GPIOx, led_self->GPIO_Pin, GPIO_PIN_SET);
  59. }
  60. else
  61. {
  62. HAL_GPIO_WritePin(led_self->GPIOx, led_self->GPIO_Pin, GPIO_PIN_RESET);
  63. led_self->current_flash_count++;
  64. if (led_self->current_flash_count >= led_self->flash_times)
  65. {
  66. led_self->in_pause = 1;
  67. }
  68. }
  69. }
  70. }
  71. void UpdateLEDStatus(LEDStatus_t status)
  72. {
  73. switch (status)
  74. {
  75. case LED_NORMAL:
  76. led_green.enabled = 0;
  77. led_red.enabled = 0;
  78. HAL_GPIO_WritePin(LED1_G_GPIO_PORT, LED1_G_PIN, GPIO_PIN_SET); // 绿灯常亮
  79. HAL_GPIO_WritePin(LED1_R_GPIO_PORT, LED1_R_PIN, GPIO_PIN_RESET); // 红灯灭
  80. break;
  81. case LED_G:
  82. led_green.enabled = 0;
  83. led_red.enabled = 0;
  84. HAL_GPIO_WritePin(LED1_G_GPIO_PORT, LED1_G_PIN, GPIO_PIN_SET); // 绿灯常亮
  85. HAL_GPIO_WritePin(LED1_R_GPIO_PORT, LED1_R_PIN, GPIO_PIN_RESET); // 红灯灭
  86. break;
  87. case LED_R:
  88. led_green.enabled = 0;
  89. led_red.enabled = 0;
  90. HAL_GPIO_WritePin(LED1_G_GPIO_PORT, LED1_G_PIN, GPIO_PIN_RESET); // 绿灯灭
  91. HAL_GPIO_WritePin(LED1_R_GPIO_PORT, LED1_R_PIN, GPIO_PIN_SET); // 红灯常亮
  92. break;
  93. case LED_COMM:
  94. led_green.enabled = 1;
  95. led_green.flash_interval_ms = 500;
  96. led_red.enabled = 0;
  97. break;
  98. case LED_WARNING_1:
  99. led_green.enabled = 1;
  100. led_green.flash_interval_ms = 500;
  101. led_red.enabled = 1;
  102. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  103. led_red.flash_times = 1; // 连闪1次
  104. led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
  105. led_red.current_flash_count = 0;
  106. led_red.in_pause = 0;
  107. break;
  108. case LED_WARNING_2:
  109. led_green.enabled = 1;
  110. led_green.flash_interval_ms = 500;
  111. led_red.enabled = 1;
  112. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  113. led_red.flash_times = 2; // 连闪2次
  114. led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
  115. led_red.current_flash_count = 0;
  116. led_red.in_pause = 0;
  117. break;
  118. case LED_WARNING_3:
  119. led_green.enabled = 1;
  120. led_green.flash_interval_ms = 500;
  121. led_red.enabled = 1;
  122. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  123. led_red.flash_times = 3; // 连闪3次
  124. led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
  125. led_red.current_flash_count = 0;
  126. led_red.in_pause = 0;
  127. break;
  128. case LED_WARNING_4:
  129. led_green.enabled = 1;
  130. led_green.flash_interval_ms = 500;
  131. led_red.enabled = 1;
  132. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  133. led_red.flash_times = 4; // 连闪4次
  134. led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
  135. led_red.current_flash_count = 0;
  136. led_red.in_pause = 0;
  137. break;
  138. case LED_WARNING_5:
  139. led_green.enabled = 1;
  140. led_green.flash_interval_ms = 500;
  141. led_red.enabled = 0;
  142. HAL_GPIO_WritePin(LED1_R_GPIO_PORT, LED1_R_PIN, GPIO_PIN_SET); // 红灯常亮
  143. break;
  144. case LED_IAP:
  145. led_green.enabled = 1;
  146. led_green.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  147. led_green.flash_times = 1; // 连闪5次
  148. led_green.flash_pause_ms = 0; // 每轮连闪之间暂停0ms
  149. led_green.current_flash_count = 0;
  150. led_green.in_pause = 0;
  151. led_red.enabled = 1;
  152. led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
  153. led_red.flash_times = 1; // 连闪5次
  154. led_red.flash_pause_ms = 0; // 每轮连闪之间暂停0ms
  155. led_red.current_flash_count = 0;
  156. led_red.in_pause = 0;
  157. break;
  158. default:
  159. led_green.enabled = 0;
  160. led_red.enabled = 0;
  161. break;
  162. }
  163. }