исправлена фильтарцяи дребезга кнопки
This commit is contained in:
parent
74d692fdd5
commit
11c00f1e0c
@ -94,7 +94,7 @@ typedef struct
|
|||||||
uint32_t Sw_Pin; ///< GPIO пин ножки кнопки
|
uint32_t Sw_Pin; ///< GPIO пин ножки кнопки
|
||||||
|
|
||||||
uint8_t Sw_ActiveLvl; ///< Активный уровень ножки (при котором кнопка нажата)
|
uint8_t Sw_ActiveLvl; ///< Активный уровень ножки (при котором кнопка нажата)
|
||||||
uint32_t Sw_PrevState; ///< Предыдущее состояние кнопки
|
uint32_t Sw_CurrentState; ///< Текущее состояние кнопки
|
||||||
uint32_t Sw_FilterDelay; ///< Фильтр от дребезга (в мс)
|
uint32_t Sw_FilterDelay; ///< Фильтр от дребезга (в мс)
|
||||||
|
|
||||||
uint32_t tickprev;
|
uint32_t tickprev;
|
||||||
|
|||||||
@ -280,47 +280,37 @@ int GPIO_Read_Switch(GPIO_SwitchTypeDef *sw)
|
|||||||
if(check_null_ptr_3(sw, sw->Sw_Port, sw->Sw_Pin))
|
if(check_null_ptr_3(sw, sw->Sw_Port, sw->Sw_Pin))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl)
|
int current_level = (HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl);
|
||||||
{
|
|
||||||
sw->Sw_PrevState = 1;
|
|
||||||
|
|
||||||
|
|
||||||
if(sw->Sw_FilterDelay) // если включена защита от дребезга
|
if(sw->Sw_FilterDelay) // если включена защита от дребезга
|
||||||
{
|
{
|
||||||
if(sw->tickprev == 0)
|
// Если таймер не запущен и состояние изменилось - запускаем таймер
|
||||||
|
if(sw->tickprev == 0 && current_level != sw->Sw_CurrentState)
|
||||||
|
{
|
||||||
sw->tickprev = local_time();
|
sw->tickprev = local_time();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если таймер запущен
|
||||||
|
if(sw->tickprev != 0)
|
||||||
|
{
|
||||||
|
// Проверяем, прошел ли достаточный интервал для фильтрации
|
||||||
if((local_time() - sw->tickprev) >= sw->Sw_FilterDelay)
|
if((local_time() - sw->tickprev) >= sw->Sw_FilterDelay)
|
||||||
{
|
{
|
||||||
if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl)
|
// Обновляем состояние только если оно все еще отличается
|
||||||
|
if(current_level != sw->Sw_CurrentState)
|
||||||
{
|
{
|
||||||
return 1;
|
sw->Sw_CurrentState = current_level;
|
||||||
}
|
}
|
||||||
else
|
// Останавливаем таймер в любом случае
|
||||||
{
|
|
||||||
sw->tickprev = 0;
|
sw->tickprev = 0;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // если нет защиты от дребезга
|
else // если нет защиты от дребезга
|
||||||
{
|
{
|
||||||
if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl)
|
sw->Sw_CurrentState = current_level;
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
else
|
return sw->Sw_CurrentState;
|
||||||
{
|
|
||||||
sw->tickprev = 0;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sw->Sw_PrevState = 0;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
//------------------------GPIO SW FUNCTIONS-------------------------
|
//------------------------GPIO SW FUNCTIONS-------------------------
|
||||||
//-------------------------------------------------------------------
|
//-------------------------------------------------------------------
|
||||||
Loading…
Reference in New Issue
Block a user