|
|
|
#include "led.h"
|
|
|
|
// #include "platform.h"
|
|
|
|
|
|
|
|
static struct led *led_table[LED_MAX_NUM];
|
|
|
|
static uint32_t p_led_table = 0;
|
|
|
|
static uint32_t delay_time_ms = 1;
|
|
|
|
|
|
|
|
osThreadId_t ledHandle;
|
|
|
|
const osThreadAttr_t led_attributes = {
|
|
|
|
.name = "led",
|
|
|
|
.stack_size = 256 * 4,
|
|
|
|
.priority = (osPriority_t)osPriorityBelowNormal,
|
|
|
|
};
|
|
|
|
|
|
|
|
My_LED_TypeDef my_led = {
|
|
|
|
Led_Init,
|
|
|
|
Led_Port,
|
|
|
|
0,
|
|
|
|
0,
|
|
|
|
// led_table,
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
/* 修改 MY_LED_COLOR_SEQ ,以及在 Led_Init 添加LED*/
|
|
|
|
|
|
|
|
int Led_Init()
|
|
|
|
{
|
|
|
|
|
|
|
|
led_setup(LED_SEQ_0, LED0_GPIO_Port, LED0_Pin, LED_STATE_ON, RESET);
|
|
|
|
led_set_state(LED_SEQ_0, LED_STATE_FLICKER_MEDIUM);
|
|
|
|
|
|
|
|
led_setup(LED_SEQ_1, LED1_GPIO_Port, LED1_Pin, LED_STATE_ON, RESET);
|
|
|
|
led_set_state(LED_SEQ_1, LED_STATE_FLICKER_MEDIUM);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Led_Task(void *argument)
|
|
|
|
{
|
|
|
|
uint16_t *delay_ms = argument;
|
|
|
|
for (;;)
|
|
|
|
{
|
|
|
|
led_callback();
|
|
|
|
osDelay(*delay_ms);
|
|
|
|
// osDelay(200);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int Led_Port(uint16_t delay_ms)
|
|
|
|
{
|
|
|
|
delay_time_ms = delay_ms;
|
|
|
|
ledHandle = osThreadNew(Led_Task, (void *)(&delay_time_ms), &led_attributes);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int led_setup(uint8_t seq, GPIO_TypeDef *gpio, uint16_t pin, enum led_state state, uint16_t level_on)
|
|
|
|
{
|
|
|
|
if (seq >= LED_MAX_NUM - 1 || seq < 0)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
struct led *Handle = (struct led *)malloc(sizeof(struct led));
|
|
|
|
if (Handle == NULL)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
led_table[seq] = Handle;
|
|
|
|
led_table[seq]->gpio = gpio;
|
|
|
|
led_table[seq]->pin = pin;
|
|
|
|
led_table[seq]->state = state;
|
|
|
|
led_table[seq]->level_on = level_on;
|
|
|
|
p_led_table++;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// int led_register(struct led *led, GPIO_TypeDef *gpio,uint16_t pin,enum led_state state,uint16_t level_on)
|
|
|
|
// {
|
|
|
|
// if(p_led_table>=LED_MAX_NUM-1){
|
|
|
|
// return -1;
|
|
|
|
// }
|
|
|
|
// led->gpio=gpio;
|
|
|
|
// led->pin=pin;
|
|
|
|
// led->state=state;
|
|
|
|
// led->level_on=level_on;
|
|
|
|
// led_table[p_led_table++]=led;
|
|
|
|
// return 0;
|
|
|
|
// }
|
|
|
|
|
|
|
|
int led_set_state(uint8_t seq, enum led_state state)
|
|
|
|
{
|
|
|
|
|
|
|
|
if (led_table[seq] == NULL)
|
|
|
|
{
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
led_table[seq]->state = state;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief led回调函数 每100ms调用一次
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
void led_callback(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
static uint32_t tick_con = 0;
|
|
|
|
tick_con++;
|
|
|
|
for (i = 0; i < p_led_table; i++)
|
|
|
|
{
|
|
|
|
switch (led_table[i]->state)
|
|
|
|
{
|
|
|
|
case LED_STATE_OFF:
|
|
|
|
HAL_GPIO_WritePin(led_table[i]->gpio, led_table[i]->pin, (~led_table[i]->level_on) & 1);
|
|
|
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,(~led_table[i]->level_on)&1);
|
|
|
|
break;
|
|
|
|
case LED_STATE_ON:
|
|
|
|
HAL_GPIO_WritePin(led_table[i]->gpio, led_table[i]->pin, led_table[i]->level_on & 1);
|
|
|
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,led_table[i]->level_on&1);
|
|
|
|
break;
|
|
|
|
case LED_STATE_FLICKER_QUICK:
|
|
|
|
HAL_GPIO_TogglePin(led_table[i]->gpio, led_table[i]->pin);
|
|
|
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,!GPIO_ReadOutputDataBit(led_table[i]->gpio,led_table[i]->pin));
|
|
|
|
break;
|
|
|
|
case LED_STATE_FLICKER_MEDIUM:
|
|
|
|
|
|
|
|
if ((tick_con & 0x01) == 0)
|
|
|
|
{
|
|
|
|
HAL_GPIO_TogglePin(led_table[i]->gpio, led_table[i]->pin);
|
|
|
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,!GPIO_ReadOutputDataBit(led_table[i]->gpio,led_table[i]->pin));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case LED_STATE_FLICKER_SLOW:
|
|
|
|
if ((tick_con & 0x03) == 0)
|
|
|
|
{
|
|
|
|
HAL_GPIO_TogglePin(led_table[i]->gpio, led_table[i]->pin);
|
|
|
|
// GPIO_WriteBit(led_table[i]->gpio,led_table[i]->pin,!GPIO_ReadOutputDataBit(led_table[i]->gpio,led_table[i]->pin));
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|