Car/Peripheral/Src/led.c
2024-07-21 08:16:02 +08:00

82 lines
1.8 KiB
C

#include "led.h"
#include "tim.h"
#include "timer.h"
#define LED_TIM (&htim3)
#define LED_R_CHAN TIM_CHANNEL_4
#define LED_G_CHAN TIM_CHANNEL_3
#define LED_B_CHAN TIM_CHANNEL_2
#define OFF 0
#define ON 1
static uint8_t state;
static uint8_t loop_times;
static uint16_t light_time;
static uint16_t loop_interval;
static uint8_t led_r, led_g, led_b;
void LED_Start(uint8_t led)
{
if (led & LED_R)
HAL_TIM_PWM_Start(LED_TIM, LED_R_CHAN);
if (led & LED_G)
HAL_TIM_PWM_Start(LED_TIM, LED_G_CHAN);
if (led & LED_B)
HAL_TIM_PWM_Start(LED_TIM, LED_B_CHAN);
}
void LED_Stop(uint8_t led)
{
if (led & LED_R)
HAL_TIM_PWM_Stop(LED_TIM, LED_R_CHAN);
if (led & LED_G)
HAL_TIM_PWM_Stop(LED_TIM, LED_G_CHAN);
if (led & LED_B)
HAL_TIM_PWM_Stop(LED_TIM, LED_B_CHAN);
}
void LED_SetDuty(uint8_t r, uint8_t g, uint8_t b)
{
__HAL_TIM_SetCompare(LED_TIM, LED_R_CHAN, r);
__HAL_TIM_SetCompare(LED_TIM, LED_G_CHAN, g);
__HAL_TIM_SetCompare(LED_TIM, LED_B_CHAN, b);
}
void LED_Callback();
void LED_StartNTimes(uint8_t loop, uint16_t interval, uint16_t time,uint8_t r, uint8_t g, uint8_t b)
{
loop_times = loop;
loop_interval = interval;
light_time = time;
led_r = r;
led_g = g;
led_b = b;
state = ON;
LED_SetDuty(r, g, b);
LED_Start(LED_ALL);
TIMER_AddLoopEvent(EVENT_LED, LED_Callback, time);
}
void LED_Callback()
{
switch (state)
{
case ON:
state = OFF;
LED_SetDuty(0, 0, 0);
if (--loop_times)
TIMER_AddLoopEvent(EVENT_LED, LED_Callback, loop_interval);
else
TIMER_DelLoopEvent(EVENT_LED);
break;
case OFF:
state = ON;
LED_SetDuty(led_r, led_g, led_b);
TIMER_AddLoopEvent(EVENT_LED, LED_Callback, light_time);
break;
}
}