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