123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- #include "main.h"
- #include "led.h"
- // 定义两个灯的控制器
- //LEDControl_t led_green = {GPIOB, LED_GREEN_Pin, 1000, 0, 1}; // 默认1秒闪一次
- //LEDControl_t led_red = {GPIOB, LED_RED_Pin, 0, 0, 0}; // 默认不闪
- LEDControl_t led_red = {
- .GPIOx = LED1_R_GPIO_PORT,
- .GPIO_Pin = LED1_R_PIN,
- .enabled = 0,
- .flash_interval_ms = 0,
- .counter = 0,
- .flash_times = 0,
- .current_flash_count = 0,
- .flash_pause_ms = 0,
- .pause_counter = 0,
- .in_pause = 0,
- .pin_state = 0
- };
- LEDControl_t led_green = {
- .GPIOx = LED1_R_GPIO_PORT,
- .GPIO_Pin = LED1_G_PIN,
- .enabled = 0,
- .flash_interval_ms = 0,
- .counter = 0,
- .flash_times = 0,
- .current_flash_count = 0,
- .flash_pause_ms = 0,
- .pause_counter = 0,
- .in_pause = 0,
- .pin_state = 0
- };
- // 每个灯的闪烁处理函数,同一个灯两颜色互斥
- void LED_FlashHandler(LEDControl_t* led_self, LEDControl_t* led_other)
- {
- if (!led_self->enabled || led_self->flash_interval_ms == 0)
- return;
- led_self->counter += 10;
- if (led_self->in_pause)
- {
- if (led_self->counter >= led_self->flash_pause_ms)
- {
- led_self->counter = 0;
- led_self->current_flash_count = 0;
- led_self->in_pause = 0;
- led_self->pin_state = 0;
- HAL_GPIO_WritePin(led_self->GPIOx, led_self->GPIO_Pin, GPIO_PIN_RESET);
- }
- return;
- }
- if (led_self->counter >= led_self->flash_interval_ms)
- {
- led_self->counter = 0;
- led_self->pin_state = !led_self->pin_state;
- if (led_self->pin_state)
- {
- // 点亮自己前,先熄灭对方,保持双色灯互斥
- HAL_GPIO_WritePin(led_other->GPIOx, led_other->GPIO_Pin, GPIO_PIN_RESET);
- HAL_GPIO_WritePin(led_self->GPIOx, led_self->GPIO_Pin, GPIO_PIN_SET);
- }
- else
- {
- HAL_GPIO_WritePin(led_self->GPIOx, led_self->GPIO_Pin, GPIO_PIN_RESET);
- led_self->current_flash_count++;
- if (led_self->current_flash_count >= led_self->flash_times)
- {
- led_self->in_pause = 1;
- }
- }
- }
- }
- void UpdateLEDStatus(LEDStatus_t status)
- {
- switch (status)
- {
- case LED_NORMAL:
- led_green.enabled = 0;
- led_red.enabled = 0;
- HAL_GPIO_WritePin(LED1_G_GPIO_PORT, LED1_G_PIN, GPIO_PIN_SET); // 绿灯常亮
- HAL_GPIO_WritePin(LED1_R_GPIO_PORT, LED1_R_PIN, GPIO_PIN_RESET); // 红灯灭
- break;
-
- case LED_G:
- led_green.enabled = 0;
- led_red.enabled = 0;
- HAL_GPIO_WritePin(LED1_G_GPIO_PORT, LED1_G_PIN, GPIO_PIN_SET); // 绿灯常亮
- HAL_GPIO_WritePin(LED1_R_GPIO_PORT, LED1_R_PIN, GPIO_PIN_RESET); // 红灯灭
- break;
-
- case LED_R:
- led_green.enabled = 0;
- led_red.enabled = 0;
- HAL_GPIO_WritePin(LED1_G_GPIO_PORT, LED1_G_PIN, GPIO_PIN_RESET); // 绿灯灭
- HAL_GPIO_WritePin(LED1_R_GPIO_PORT, LED1_R_PIN, GPIO_PIN_SET); // 红灯常亮
- break;
- case LED_COMM:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 0;
- break;
- case LED_WARNING_1:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 1; // 连闪1次
- led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- case LED_WARNING_2:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 2; // 连闪2次
- led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- case LED_WARNING_3:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 3; // 连闪3次
- led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- case LED_WARNING_4:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 4; // 连闪4次
- led_red.flash_pause_ms = 2000; // 每轮连闪之间暂停2s
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- case LED_WARNING_5:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 500;
- led_red.enabled = 0;
- HAL_GPIO_WritePin(LED1_R_GPIO_PORT, LED1_R_PIN, GPIO_PIN_SET); // 红灯常亮
- break;
-
- case LED_IAP:
- led_green.enabled = 1;
- led_green.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_green.flash_times = 1; // 连闪5次
- led_green.flash_pause_ms = 0; // 每轮连闪之间暂停0ms
- led_green.current_flash_count = 0;
- led_green.in_pause = 0;
- led_red.enabled = 1;
- led_red.flash_interval_ms = 100; // 每次亮或灭为100ms(一次闪为200ms)
- led_red.flash_times = 1; // 连闪5次
- led_red.flash_pause_ms = 0; // 每轮连闪之间暂停0ms
- led_red.current_flash_count = 0;
- led_red.in_pause = 0;
- break;
-
- default:
- led_green.enabled = 0;
- led_red.enabled = 0;
- break;
- }
- }
|