#include "gpio_state_led.h" #include "sw_timer.h" #define GPIO_LED_LE1_PORT (Pn_Type*)PF #define GPIO_LED_LE1_PIN_NUM 4 #define GPIO_LED_D1_PORT (Pn_Type*)PE #define GPIO_LED_D1_PIN_NUM 4 #define GPIO_LED_D2_PORT (Pn_Type*)PE #define GPIO_LED_D2_PIN_NUM 3 #define GPIO_LED_D3_PORT (Pn_Type*)PE #define GPIO_LED_D3_PIN_NUM 2 #define GPIO_LED_D4_PORT (Pn_Type*)PE #define GPIO_LED_D4_PIN_NUM 1 static void State_Led_Output_Process(void); static void State_Led_Off(GPIO_LED_LIST gpio_led_index); static void State_Led_On(GPIO_LED_LIST gpio_led_index); typedef void (*GPIO_LED_ON_OFF_FUNC)(GPIO_LED_LIST gpio_led_index); typedef struct { Pn_Type* Port; uint8_t Pin; GPIO_LED_MODE Mode; bool isLedOn; uint32_t nCheckTime; uint32_t nOnTime; uint32_t nOffTime; GPIO_LED_ON_OFF_FUNC LedOnFunction; GPIO_LED_ON_OFF_FUNC LedOffunction; }GPIO_STATE_LED_INFO; static GPIO_STATE_LED_INFO Gpio_Led_Ctrl_Info[GPIO_LED_MAX] = { {GPIO_LED_LE1_PORT, GPIO_LED_LE1_PIN_NUM, GPIO_LED_MODE_OFF, 0, 0, NULL, NULL}, {GPIO_LED_D1_PORT, GPIO_LED_D1_PIN_NUM, GPIO_LED_MODE_OFF, 0, 0, NULL, NULL}, {GPIO_LED_D2_PORT, GPIO_LED_D2_PIN_NUM, GPIO_LED_MODE_OFF, 0, 0, NULL, NULL}, {GPIO_LED_D3_PORT, GPIO_LED_D3_PIN_NUM, GPIO_LED_MODE_OFF, 0, 0, NULL, NULL}, {GPIO_LED_D4_PORT, GPIO_LED_D4_PIN_NUM, GPIO_LED_MODE_OFF, 0, 0, NULL, NULL}, }; void Gpio_StateLed_Initialization(void) { uint8_t i; for(i = 0 ; i < GPIO_LED_MAX ; i++) { HAL_GPIO_ConfigOutput(Gpio_Led_Ctrl_Info[i].Port, Gpio_Led_Ctrl_Info[i].Pin, PUSH_PULL_OUTPUT); HAL_GPIO_ConfigPullup(Gpio_Led_Ctrl_Info[i].Port, Gpio_Led_Ctrl_Info[i].Pin, PUPDx_EnablePU); Gpio_Led_Ctrl_Info[i].LedOnFunction = State_Led_On; Gpio_Led_Ctrl_Info[i].LedOffunction = State_Led_Off; } SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 1, State_Led_Output_Process); } void Gpio_Led_OutputSet(GPIO_LED_LIST gpio_led_index, GPIO_LED_MODE gpio_led_mode, uint32_t OnTime, uint32_t OffTime) { Gpio_Led_Ctrl_Info[gpio_led_index].Mode = gpio_led_mode; Gpio_Led_Ctrl_Info[gpio_led_index].isLedOn = true; Gpio_Led_Ctrl_Info[gpio_led_index].nCheckTime = millis(); Gpio_Led_Ctrl_Info[gpio_led_index].nOnTime = OnTime; Gpio_Led_Ctrl_Info[gpio_led_index].nOffTime = OffTime; } static void State_Led_Off(GPIO_LED_LIST gpio_led_index) { HAL_GPIO_SetPin(Gpio_Led_Ctrl_Info[gpio_led_index].Port, _BIT(Gpio_Led_Ctrl_Info[gpio_led_index].Pin)); } static void State_Led_On(GPIO_LED_LIST gpio_led_index) { HAL_GPIO_ClearPin(Gpio_Led_Ctrl_Info[gpio_led_index].Port, _BIT(Gpio_Led_Ctrl_Info[gpio_led_index].Pin)); } static void State_Led_Output_Process(void) { uint8_t i; GPIO_STATE_LED_INFO* pControlInfo; for(i = 0 ; i < GPIO_LED_MAX ; i++) { pControlInfo = &Gpio_Led_Ctrl_Info[i]; switch (pControlInfo->Mode) { case GPIO_LED_MODE_OFF: pControlInfo->LedOffunction(i); break; case GPIO_LED_MODE_ON: pControlInfo->LedOnFunction(i); break; case GPIO_LED_MODE_TOGGLE: if(pControlInfo->isLedOn == true) { if((millis() - pControlInfo->nCheckTime) > pControlInfo->nOnTime ) { pControlInfo->nCheckTime = millis(); pControlInfo->isLedOn = false; } pControlInfo->LedOnFunction(i); } else { if((millis() - pControlInfo->nCheckTime) > pControlInfo->nOffTime ) { pControlInfo->nCheckTime = millis(); pControlInfo->isLedOn = true; } pControlInfo->LedOffunction(i); } break; } } } #if 0 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; } } #endif