213 lines
4.3 KiB
C
213 lines
4.3 KiB
C
#include "leds.h"
|
||
#include "gpios.h"
|
||
|
||
static gpio_t *leds[LEDS_MAX];
|
||
static __IO BOOL _init = FALSE;
|
||
/**
|
||
* @brief 初始化LED
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
void leds_init(void)
|
||
{
|
||
if (_init == TRUE)
|
||
{
|
||
return;
|
||
}
|
||
|
||
GPIO_SET_OUTPUT(LED1_GPIO_Port, LED1_Pin);
|
||
GPIO_SET_OUTPUT(LED2_GPIO_Port, LED2_Pin);
|
||
GPIO_SET_OUTPUT(LED3_GPIO_Port, LED3_Pin);
|
||
GPIO_SET_OUTPUT(LED4_GPIO_Port, LED4_Pin);
|
||
GPIO_SET_OUTPUT(LED5_GPIO_Port, LED5_Pin);
|
||
for (uint8_t i = 0; i < LEDS_MAX; i++)
|
||
{
|
||
if (leds[i] == NULL)
|
||
{
|
||
switch (i)
|
||
{
|
||
case LEDS_RED:
|
||
leds[i] = gpio_create(LED1_GPIO_Port, LED1_Pin);
|
||
break;
|
||
case LEDS_GREEN:
|
||
leds[i] = gpio_create(LED2_GPIO_Port, LED2_Pin);
|
||
break;
|
||
case LEDS_YELLOW:
|
||
leds[i] = gpio_create(LED3_GPIO_Port, LED3_Pin);
|
||
break;
|
||
case LEDS_ORANGE:
|
||
leds[i] = gpio_create(LED4_GPIO_Port, LED4_Pin);
|
||
break;
|
||
case LEDS_BLUE:
|
||
leds[i] = gpio_create(LED5_GPIO_Port, LED5_Pin);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
_init = TRUE;
|
||
}
|
||
|
||
/**
|
||
* @brief 反初始化LED
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
void leds_dinit(void)
|
||
{
|
||
if (_init == FALSE)
|
||
{
|
||
return;
|
||
}
|
||
GPIO_SET_ANALOG(LED1_GPIO_Port, LED1_Pin);
|
||
GPIO_SET_ANALOG(LED2_GPIO_Port, LED2_Pin);
|
||
GPIO_SET_ANALOG(LED3_GPIO_Port, LED3_Pin);
|
||
GPIO_SET_ANALOG(LED4_GPIO_Port, LED4_Pin);
|
||
GPIO_SET_ANALOG(LED5_GPIO_Port, LED5_Pin);
|
||
|
||
// 这里不释放,在初始化的时候会判断是否已经创建对象,防止在反作用情况下频繁的申请和释放内存
|
||
|
||
// for (uint8_t i = 0; i < LEDS_MAX; i++)
|
||
// {
|
||
// if (leds[i] != NULL)
|
||
// {
|
||
// osel_mem_free(leds[i]);
|
||
// leds[i] = NULL;
|
||
// }
|
||
// }
|
||
_init = FALSE;
|
||
}
|
||
|
||
/**
|
||
* @brief 打开LED
|
||
* @param {leds_e} io
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
void leds_on(leds_e io)
|
||
{
|
||
if (_init == FALSE)
|
||
{
|
||
return;
|
||
}
|
||
switch (io)
|
||
{
|
||
case LEDS_RED:
|
||
GPIO_SET_OUTPUT(LED1_GPIO_Port, LED1_Pin);
|
||
break;
|
||
case LEDS_GREEN:
|
||
GPIO_SET_OUTPUT(LED2_GPIO_Port, LED2_Pin);
|
||
break;
|
||
case LEDS_YELLOW:
|
||
GPIO_SET_OUTPUT(LED3_GPIO_Port, LED3_Pin);
|
||
break;
|
||
case LEDS_ORANGE:
|
||
GPIO_SET_OUTPUT(LED4_GPIO_Port, LED4_Pin);
|
||
break;
|
||
case LEDS_BLUE:
|
||
GPIO_SET_OUTPUT(LED5_GPIO_Port, LED5_Pin);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
if (io < LEDS_MAX)
|
||
{
|
||
leds[(uint8_t)io]->reset(*leds[(uint8_t)io]);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* @brief 打开所有LED
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
void leds_on_all(void)
|
||
{
|
||
if (_init == FALSE)
|
||
{
|
||
return;
|
||
}
|
||
leds_on(LEDS_RED);
|
||
leds_on(LEDS_GREEN);
|
||
leds_on(LEDS_YELLOW);
|
||
leds_on(LEDS_ORANGE);
|
||
leds_on(LEDS_BLUE);
|
||
}
|
||
|
||
/**
|
||
* @brief 关闭LED
|
||
* @param {leds_e} io
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
void leds_off(leds_e io)
|
||
{
|
||
if (_init == FALSE)
|
||
{
|
||
return;
|
||
}
|
||
if (io < LEDS_MAX)
|
||
{
|
||
leds[(uint8_t)io]->set(*leds[(uint8_t)io]);
|
||
}
|
||
|
||
// 反初始化其他LED,这里暂时先不做处理,如果电流不够,可以考虑关闭其他LED
|
||
// switch (io)
|
||
// {
|
||
// case LEDS_RED:
|
||
// GPIO_SET_ANALOG(LED1_GPIO_Port, LED1_Pin);
|
||
// break;
|
||
// case LEDS_GREEN:
|
||
// GPIO_SET_ANALOG(LED2_GPIO_Port, LED2_Pin);
|
||
// break;
|
||
// case LEDS_YELLOW:
|
||
// GPIO_SET_ANALOG(LED3_GPIO_Port, LED3_Pin);
|
||
// break;
|
||
// case LEDS_ORANGE:
|
||
// GPIO_SET_ANALOG(LED4_GPIO_Port, LED4_Pin);
|
||
// break;
|
||
// case LEDS_BLUE:
|
||
// GPIO_SET_ANALOG(LED5_GPIO_Port, LED5_Pin);
|
||
// break;
|
||
// default:
|
||
// break;
|
||
// }
|
||
}
|
||
|
||
/**
|
||
* @brief 关闭所有LED
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
void leds_off_all(void)
|
||
{
|
||
if (_init == FALSE)
|
||
{
|
||
return;
|
||
}
|
||
leds_off(LEDS_RED);
|
||
leds_off(LEDS_GREEN);
|
||
leds_off(LEDS_YELLOW);
|
||
leds_off(LEDS_ORANGE);
|
||
leds_off(LEDS_BLUE);
|
||
}
|
||
|
||
/**
|
||
* @brief 翻转LED
|
||
* @param {leds_e} io
|
||
* @return {*}
|
||
* @note
|
||
*/
|
||
void leds_toggle(leds_e io)
|
||
{
|
||
if (_init == FALSE)
|
||
{
|
||
return;
|
||
}
|
||
if (io < LEDS_MAX)
|
||
{
|
||
leds[(uint8_t)io]->toggle(*leds[(uint8_t)io]);
|
||
}
|
||
}
|