Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Гувербаттон - вариант отслеживания удержания кнопки после нескольких нажатий (до 255) #26

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
11 changes: 6 additions & 5 deletions GyverButton/GyverButton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,13 +69,14 @@ boolean GButton::isClick() {
return true;
} else return false;
}
boolean GButton::isHolded() {
boolean GButton::isHolded(byte cnt) {
if (flags.tickMode) GButton::tick();
if (flags.isHolded_f) {
flags.isHolded_f = false;
if (flags.isHolded_f == cnt || flags.isHolded_f != 0 && cnt == 255) {
flags.isHolded_f = 0;
return true;
} else return false;
}

boolean GButton::isHold() {
if (flags.tickMode) GButton::tick();
if (flags.step_flag) return true;
Expand Down Expand Up @@ -167,9 +168,9 @@ void GButton::tick() {
// кнопка удерживается
if (flags.btn_flag && flags.btn_state && (millis() - btn_timer >= _timeout) && !flags.hold_flag) {
flags.hold_flag = true;
flags.isHolded_f = btn_counter + 1;
btn_counter = 0;
last_counter = 0;
flags.isHolded_f = true;
flags.step_flag = true;
flags.oneClick_f = false;
btn_timer = millis();
Expand All @@ -181,4 +182,4 @@ void GButton::tick() {
btn_counter = 0;
flags.counter_flag = true;
}
}
}
7 changes: 4 additions & 3 deletions GyverButton/GyverButton.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ typedef struct
bool btn_flag: 1;
bool hold_flag: 1;
bool counter_flag: 1;
bool isHolded_f: 1;
bool isRelease_f: 1;
bool isPress_f: 1;
bool step_flag: 1;
Expand All @@ -38,6 +37,7 @@ typedef struct
bool mode: 1;
bool type: 1;
bool tickMode: 1;
uint8_t isHolded_f: 8;
} GyverButtonFlags;
#pragma pack(pop)

Expand All @@ -62,14 +62,15 @@ class GButton
void setTickMode(boolean tickMode); // (MANUAL / AUTO) ручной или автоматический опрос кнопки функцией tick()
// MANUAL - нужно вызывать функцию tick() вручную
// AUTO - tick() входит во все остальные функции и опрашивается сама


void tick(); // опрос кнопки
void tick(boolean state); // опрос внешнего значения (0 нажато, 1 не нажато) (для матричных, резистивных клавиатур и джойстиков)

boolean isPress(); // возвращает true при нажатии на кнопку. Сбрасывается после вызова
boolean isRelease(); // возвращает true при отпускании кнопки. Сбрасывается после вызова
boolean isClick(); // возвращает true при клике. Сбрасывается после вызова
boolean isHolded(); // возвращает true при удержании дольше timeout. Сбрасывается после вызова
boolean isHolded(byte cnt = 255); // возвращает true если количество нажатий перед ужержанием было равно cnt и удержание дольше timeout. Сбрасывается после вызова
boolean isHold(); // возвращает true при нажатой кнопке, не сбрасывается
boolean state(); // возвращает состояние кнопки

Expand Down Expand Up @@ -101,4 +102,4 @@ class GButton
#define MANUAL 0
#define AUTO 1

#endif
#endif