#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]); } }