#include "gpio_state_led.h" #include "sw_timer.h" static void State_Led_Output_Process(void); static STATE_LED_MODE StateLedMode = STATE_LED_MODE_UNKNOW; static STATE_LED_STEP StateLedStep = STATE_LED_STEP_INIT; static STATE_LED_ONOFF_TIME StateLedTime; static uint32_t StateLedCheckTime; static STATE_LED_ONOFF_TIME StateLedOnOffTime[STATE_LED_MODE_MAX] = { {100, 900}, //STATE_LED_MODE_OFF, {500, 500}, //STATE_LED_MODE_1, {1000, 1000}, //STATE_LED_MODE_2, {1500, 1500}, //STATE_LED_MODE_3, {2000, 2000}, //STATE_LED_MODE_4, {2500, 2500}, //STATE_LED_MODE_5, }; void Gpio_StateLed_Initialization(void) { HAL_GPIO_ConfigOutput(GPIO_STATE_LED_PORT, GPIO_STATE_LED_PIN_NUM, PUSH_PULL_OUTPUT); HAL_GPIO_ConfigPullup(GPIO_STATE_LED_PORT, GPIO_STATE_LED_PIN_NUM, PUPDx_EnablePU); Gpio_StateLed_Set_Mode(STATE_LED_MODE_OFF); SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 1, State_Led_Output_Process); } void Gpio_StateLed_Set_Mode(STATE_LED_MODE mode) { if(StateLedMode == mode) return; StateLedMode = mode; StateLedStep = STATE_LED_STEP_INIT; StateLedTime = StateLedOnOffTime[mode]; } STATE_LED_MODE Gpio_StateLed_Get_Mode(void) { return StateLedMode; } static void State_Led_Output_Process(void) { switch(StateLedStep) { case STATE_LED_STEP_INIT: StateLedCheckTime = millis(); StateLedStep = STATE_LED_STEP_ON_TIME; break; case STATE_LED_STEP_ON_TIME: if((millis() - StateLedCheckTime) <= StateLedTime.onTime) { GPIO_STATE_LED_ON; } else { StateLedCheckTime = millis(); StateLedStep = STATE_LED_STEP_OFF_TIME; } break; case STATE_LED_STEP_OFF_TIME: if((millis() - StateLedCheckTime) <= StateLedTime.OffTime) { GPIO_STATE_LED_OFF; } else { StateLedCheckTime = millis(); StateLedStep = STATE_LED_STEP_ON_TIME; } break; } }