You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

214 lines
6.1 KiB

6 months ago
#include "gpio_state_led.h"
#include "sw_timer.h"
5 months ago
#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
6 months ago
static void State_Led_Output_Process(void);
5 months ago
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;
}
}
}
6 months ago
5 months ago
#if 0
6 months ago
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;
}
}
5 months ago
#endif