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.
 
 
 
Play/akva/_256-27nrf/button/sav_button.cpp

115 lines
4.0 KiB

#include "sav_button.h"
/**
* Конструктор класса кнопки
* Кнопка это цифровой пин подтянутый к питанию и замыкаемый на землю
* Событие срабатывания происходит по нажатию кнопки (возвращается 1)
* и отпусканию кнопки (возвращается время нажатия кнопки, мсек)
* tm1 - таймаут дребезга контактов. По умолчанию 50мс
* tm2 - время длинного нажатия клавиши. По умолчанию 2000мс
* tm3 - врямы перевода кнопки в генерацию серии нажатий. По умолсанию отключено
* tm4 - время между кликами в серии. По умолчанию 500 мс. Если tm3 = 0 то не работает
*/
SButton::SButton(uint8_t pin,uint16_t tm1, uint16_t tm2,uint16_t tm3, uint16_t tm4){
Pin = pin;
State = false;
Long_press_state = false;
Auto_press_state = false;
Ms1 = 0;
Ms2 = 0;
Ms_auto_click = 0;
TM_bounce = tm1;
TM_long_click = tm2;
TM_auto_click = tm3;
Period_auto_click = tm4;
}
/**
* Инициализация кнопки
*/
void SButton::begin() {
pinMode(Pin, INPUT_PULLUP);
#ifdef DEBUG_SERIAL
Serial.print("Init button pin ");
Serial.println(Pin);
#endif
}
/**
* Действие производимое в цикле или по таймеру
* возвращает SB_NONE если кнопка не нажата и событие нажатие или динного нажатия кнопки
*/
SBUTTON_CLICK SButton::Loop() {
uint32_t ms = millis();
bool pin_state = digitalRead(Pin);
// Фиксируем нажатие кнопки
if( pin_state == LOW && State == false && (ms-Ms1)>TM_bounce ){
uint16_t dt = ms - Ms1;
Long_press_state = false;
Auto_press_state = false;
#ifdef DEBUG_SERIAL
Serial.print(">>>Event button, pin=");
Serial.print(Pin);
Serial.print(",press ON, tm=");
Serial.print(dt);
Serial.println(" ms");
#endif
State = true;
Ms2 = ms;
if( TM_long_click == 0 && TM_auto_click == 0 )return SB_CLICK;
}
// Фиксируем длинное нажатие кнопки
if( pin_state == LOW && !Long_press_state && TM_long_click>0 && ( ms - Ms2 )>TM_long_click ){
uint16_t dt = ms - Ms2;
Long_press_state = true;
#ifdef DEBUG_SERIAL
Serial.print(">>>Event button, pin=");
Serial.print(Pin);
Serial.print(",long press, tm=");
Serial.print(dt);
Serial.println(" ms");
#endif
return SB_LONG_CLICK;
}
// Фиксируем авто нажатие кнопки
if( pin_state == LOW && TM_auto_click > 0
&& ( ms - Ms2 ) > TM_auto_click
&& ( ms - Ms_auto_click ) > Period_auto_click ){
uint16_t dt = ms - Ms2;
Auto_press_state = true;
Ms_auto_click = ms;
#ifdef DEBUG_SERIAL
Serial.print(">>>Event button, pin=");
Serial.print(Pin);
Serial.print(",auto press, tm=");
Serial.print(dt);
Serial.println(" ms");
#endif
return SB_AUTO_CLICK;
}
// Фиксируем отпускание кнопки
if( pin_state == HIGH && State == true && (ms-Ms2)>TM_bounce ){
uint16_t dt = ms - Ms2;
// Сбрасываем все флаги
State = false;
#ifdef DEBUG_SERIAL
Serial.print(">>>Event button, pin=");
Serial.print(Pin);
Serial.print(",press OFF, tm=");
Serial.print(dt);
Serial.println(" ms");
#endif
Ms1 = ms;
// Возвращаем короткий клик
if( (TM_long_click != 0 || TM_auto_click != 0) && !Long_press_state && !Auto_press_state )return SB_CLICK;
}
return SB_NONE;
}