diff --git a/README.md b/README.md
index 7da4aae..fcdca75 100644
--- a/README.md
+++ b/README.md
@@ -208,6 +208,7 @@
| getSteps | ✔ | ✔ | ✔ | ✔ |
| releaseHold | ✔ | ✔ | ✔ | ✔ |
| releaseStep | ✔ | ✔ | ✔ | ✔ |
+| releaseHoldStep | ✔ | ✔ | ✔ | ✔ |
| waiting | ✔ | ✔ | ✔ | ✔ |
| busy | ✔ | ✔ | ✔ | ✔ |
| action | ✔ | ✔ | ✔ | ✔ |
@@ -334,6 +335,10 @@ bool releaseHold(uint8_t clicks);
bool releaseStep();
bool releaseStep(uint8_t clicks);
+// кнопка отпущена после удержания или импульсного удержания [событие]
+bool releaseHoldStep();
+bool releaseHoldStep(uint8_t clicks);
+
// получить количество кликов
uint8_t getClicks();
@@ -1767,6 +1772,7 @@ void loop() {
- v3.5.3
- Добавлено количество кликов в опрос press/release/click/pressing
- v3.5.5 - коллбэк на базе std::function для ESP
+- v3.5.8 - добавлен метод releaseHoldStep()
## Баги и обратная связь
diff --git a/keywords.txt b/keywords.txt
index d308134..5723e0e 100644
--- a/keywords.txt
+++ b/keywords.txt
@@ -51,6 +51,7 @@ getClicks KEYWORD2
getSteps KEYWORD2
releaseHold KEYWORD2
releaseStep KEYWORD2
+releaseHoldStep KEYWORD2
timeout KEYWORD2
waiting KEYWORD2
busy KEYWORD2
diff --git a/library.properties b/library.properties
index a7ddec0..8dc73d3 100644
--- a/library.properties
+++ b/library.properties
@@ -1,5 +1,5 @@
name=EncButton
-version=3.5.7
+version=3.5.8
author=AlexGyver
maintainer=AlexGyver
sentence=Light and powerful library for button and encoder operation for Arduino
diff --git a/src/core/VirtButton.h b/src/core/VirtButton.h
index 1cec995..be53682 100644
--- a/src/core/VirtButton.h
+++ b/src/core/VirtButton.h
@@ -76,35 +76,35 @@ class VirtButton {
public:
// ====================== SET ======================
// установить таймаут удержания, умолч. 600 (макс. 4000 мс)
- void setHoldTimeout(const uint16_t& tout) {
+ void setHoldTimeout(const uint16_t tout) {
#ifndef EB_HOLD_TIME
EB_HOLD_T = tout >> EB_SHIFT;
#endif
}
// установить таймаут импульсного удержания, умолч. 200 (макс. 4000 мс)
- void setStepTimeout(const uint16_t& tout) {
+ void setStepTimeout(const uint16_t tout) {
#ifndef EB_STEP_TIME
EB_STEP_T = tout >> EB_SHIFT;
#endif
}
// установить таймаут ожидания кликов, умолч. 500 (макс. 4000 мс)
- void setClickTimeout(const uint16_t& tout) {
+ void setClickTimeout(const uint16_t tout) {
#ifndef EB_CLICK_TIME
EB_CLICK_T = tout >> EB_SHIFT;
#endif
}
// установить таймаут антидребезга, умолч. 50 (макс. 255 мс)
- void setDebTimeout(const uint8_t& tout) {
+ void setDebTimeout(const uint8_t tout) {
#ifndef EB_DEB_TIME
EB_DEB_T = tout;
#endif
}
// установить уровень кнопки (HIGH - кнопка замыкает VCC, LOW - замыкает GND)
- void setBtnLevel(const bool& level) {
+ void setBtnLevel(const bool level) {
bf.write(EB_INV, !level);
}
@@ -149,7 +149,7 @@ class VirtButton {
}
// кнопка нажата с предварительными кликами [событие]
- bool press(const uint8_t& num) {
+ bool press(const uint8_t num) {
return (clicks == num) && press();
}
@@ -159,7 +159,7 @@ class VirtButton {
}
// кнопка отпущена (в любом случае) с предварительными кликами [событие]
- bool release(const uint8_t& num) {
+ bool release(const uint8_t num) {
return (clicks == num) && release();
}
@@ -169,7 +169,7 @@ class VirtButton {
}
// клик по кнопке (отпущена без удержания) с предварительными кликами [событие]
- bool click(const uint8_t& num) {
+ bool click(const uint8_t num) {
return (clicks == num) && click();
}
@@ -179,7 +179,7 @@ class VirtButton {
}
// кнопка зажата (между press() и release()) с предварительными кликами [состояние]
- bool pressing(const uint8_t& num) {
+ bool pressing(const uint8_t num) {
return (clicks == num) && pressing();
}
@@ -189,7 +189,7 @@ class VirtButton {
}
// кнопка была удержана (больше таймаута) с предварительными кликами [событие]
- bool hold(const uint8_t& num) {
+ bool hold(const uint8_t num) {
return (clicks == num) && hold();
}
@@ -199,7 +199,7 @@ class VirtButton {
}
// кнопка удерживается (больше таймаута) с предварительными кликами [состояние]
- bool holding(const uint8_t& num) {
+ bool holding(const uint8_t num) {
return (clicks == num) && holding();
}
@@ -209,7 +209,7 @@ class VirtButton {
}
// импульсное удержание с предварительными кликами [событие]
- bool step(const uint8_t& num) {
+ bool step(const uint8_t num) {
return (clicks == num) && step();
}
@@ -219,7 +219,7 @@ class VirtButton {
}
// зафиксировано указанное количество кликов [событие]
- bool hasClicks(const uint8_t& num) {
+ bool hasClicks(const uint8_t num) {
return (clicks == num) && hasClicks();
}
@@ -246,7 +246,7 @@ class VirtButton {
}
// кнопка отпущена после удержания с предварительными кликами [событие]
- bool releaseHold(const uint8_t& num) {
+ bool releaseHold(const uint8_t num) {
return clicks == num && bf.eq(EB_CLKS_R | EB_HLD | EB_STP, EB_CLKS_R | EB_HLD);
}
@@ -256,10 +256,20 @@ class VirtButton {
}
// кнопка отпущена после импульсного удержания с предварительными кликами [событие]
- bool releaseStep(const uint8_t& num) {
+ bool releaseStep(const uint8_t num) {
return clicks == num && bf.eq(EB_CLKS_R | EB_STP, EB_CLKS_R | EB_STP);
}
+ // кнопка отпущена после удержания или импульсного удержания [событие]
+ bool releaseHoldStep() {
+ return releaseHold() || releaseStep();
+ }
+
+ // кнопка отпущена после удержания или импульсного удержания с предварительными кликами [событие]
+ bool releaseHoldStep(const uint8_t num) {
+ return releaseHold(num) || releaseStep(num);
+ }
+
// кнопка ожидает повторных кликов [состояние]
bool waiting() {
return clicks && bf.eq(EB_PRS | EB_REL, 0);
@@ -301,7 +311,7 @@ class VirtButton {
// ====================== TIME ======================
// после взаимодействия с кнопкой (или энкодером EncButton) прошло указанное время, мс [событие]
- bool timeout(const uint16_t& tout) {
+ bool timeout(const uint16_t tout) {
if (bf.read(EB_TOUT) && (uint16_t)((uint16_t)EB_uptime() - tmr) > tout) {
bf.clear(EB_TOUT);
return 1;
@@ -318,7 +328,7 @@ class VirtButton {
}
// кнопка удерживается дольше чем (с начала нажатия), мс [состояние]
- bool pressFor(const uint16_t& ms) {
+ bool pressFor(const uint16_t ms) {
return pressFor() > ms;
}
@@ -337,7 +347,7 @@ class VirtButton {
}
// кнопка удерживается дольше чем (с начала удержания), мс [состояние]
- bool holdFor(const uint16_t& ms) {
+ bool holdFor(const uint16_t ms) {
return holdFor() > ms;
}
@@ -387,7 +397,7 @@ class VirtButton {
}
// обработка кнопки без сброса событий и вызова коллбэка
- bool tickRaw(const bool& s) {
+ bool tickRaw(const bool s) {
return pollBtn(s);
}
diff --git a/src/core/VirtEncButton.h b/src/core/VirtEncButton.h
index aabfbb9..96fe226 100644
--- a/src/core/VirtEncButton.h
+++ b/src/core/VirtEncButton.h
@@ -14,7 +14,7 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
public:
// ====================== SET ======================
// установить таймаут быстрого поворота, мс
- void setFastTimeout(const uint8_t& tout) {
+ void setFastTimeout(const uint8_t tout) {
#ifndef EB_FAST_TIME
EB_FAST_T = tout;
#endif
@@ -71,7 +71,7 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
// ====================== POLL ======================
// ISR
// обработка в прерывании (только энкодер). Вернёт 0 в покое, 1 или -1 при повороте
- int8_t tickISR(const bool& e0, const bool& e1) {
+ int8_t tickISR(const bool e0, const bool e1) {
return tickISR(e0 | (e1 << 1));
}
@@ -99,12 +99,12 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
// TICK
// обработка энкодера и кнопки
- bool tick(const bool& e0, const bool& e1, const bool& btn) {
+ bool tick(const bool e0, const bool e1, const bool btn) {
return tick(e0 | (e1 << 1), btn);
}
// обработка энкодера и кнопки. state = -1 для пропуска обработки энкодера
- bool tick(const int8_t& state, const bool& btn) {
+ bool tick(const int8_t state, const bool btn) {
clear();
bool f = tickRaw(state, btn);
@@ -115,13 +115,13 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
}
// обработка энкодера (в прерывании) и кнопки
- bool tick(const bool& btn) {
+ bool tick(const bool btn) {
return tick(-1, btn);
}
// RAW
// обработка без сброса событий и вызова коллбэка
- bool tickRaw(const bool& e0, const bool& e1, const bool& btn) {
+ bool tickRaw(const bool e0, const bool e1, const bool btn) {
return tickRaw(e0 | (e1 << 1), btn);
}
@@ -158,7 +158,7 @@ class VirtEncButton : public VirtButton, public VirtEncoder {
}
// обработка без сброса событий и вызова коллбэка (кнопка)
- bool tickRaw(const bool& btn) {
+ bool tickRaw(const bool btn) {
return tickRaw(-1, btn);
}
diff --git a/src/core/VirtEncoder.h b/src/core/VirtEncoder.h
index 72d76db..69207ae 100644
--- a/src/core/VirtEncoder.h
+++ b/src/core/VirtEncoder.h
@@ -27,28 +27,28 @@ class VirtEncoder {
}
// ====================== SET ======================
// инвертировать направление энкодера
- void setEncReverse(const bool& rev) {
+ void setEncReverse(const bool rev) {
if (rev) ef.set(EB_REV);
else ef.clear(EB_REV);
}
// установить тип энкодера (EB_STEP4_LOW, EB_STEP4_HIGH, EB_STEP2, EB_STEP1)
- void setEncType(const uint8_t& type) {
+ void setEncType(const uint8_t type) {
ef.flags = (ef.flags & 0b11111100) | type;
}
// использовать обработку энкодера в прерывании
- void setEncISR(const bool& use) {
+ void setEncISR(const bool use) {
ef.write(EB_EISR, use);
}
// инициализация энкодера
- void initEnc(const bool& e0, const bool& e1) {
+ void initEnc(const bool e0, const bool e1) {
initEnc(e0 | (e1 << 1));
}
// инициализация энкодера совмещённым значением
- void initEnc(const int8_t& v) {
+ void initEnc(const int8_t v) {
prev = v;
}
@@ -71,7 +71,7 @@ class VirtEncoder {
// ====================== POLL ======================
// ISR
// опросить энкодер в прерывании. Вернёт 1 или -1 при вращении, 0 при остановке
- int8_t tickISR(const bool& e0, const bool& e1) {
+ int8_t tickISR(const bool e0, const bool e1) {
return tickISR(e0 | (e1 << 1));
}
@@ -87,7 +87,7 @@ class VirtEncoder {
// TICK
// опросить энкодер. Вернёт 1 или -1 при вращении, 0 при остановке
- int8_t tick(const bool& e0, const bool& e1) {
+ int8_t tick(const bool e0, const bool e1) {
return tick(e0 | (e1 << 1));
}
@@ -106,7 +106,7 @@ class VirtEncoder {
// RAW
// опросить энкодер без сброса события поворота
- int8_t tickRaw(const bool& e0, const bool& e1) {
+ int8_t tickRaw(const bool e0, const bool e1) {
return tickRaw(e0 | (e1 << 1));
}
@@ -132,7 +132,7 @@ class VirtEncoder {
// POLL
// опросить энкодер без установки события поворота (быстрее). Вернёт 1 или -1 при вращении, 0 при остановке
- int8_t pollEnc(const bool& e0, const bool& e1) {
+ int8_t pollEnc(const bool e0, const bool e1) {
return pollEnc(e0 | (e1 << 1));
}
diff --git a/src/core/flags.h b/src/core/flags.h
index a79e02e..32d428e 100644
--- a/src/core/flags.h
+++ b/src/core/flags.h
@@ -7,23 +7,23 @@ template
struct Flags {
T flags = 0;
- inline T mask(const T& x) __attribute__((always_inline)) {
+ inline T mask(const T x) __attribute__((always_inline)) {
return flags & x;
}
- inline void set(const T& x) __attribute__((always_inline)) {
+ inline void set(const T x) __attribute__((always_inline)) {
flags |= x;
}
- inline void clear(const T& x) __attribute__((always_inline)) {
+ inline void clear(const T x) __attribute__((always_inline)) {
flags &= ~x;
}
- inline bool read(const T& x) __attribute__((always_inline)) {
+ inline bool read(const T x) __attribute__((always_inline)) {
return flags & x;
}
- inline void write(const T& x, const bool& v) __attribute__((always_inline)) {
+ inline void write(const T x, const bool v) __attribute__((always_inline)) {
if (v) set(x);
else clear(x);
}
- inline bool eq(const T& x, const T& y) __attribute__((always_inline)) {
+ inline bool eq(const T x, const T y) __attribute__((always_inline)) {
return (flags & x) == y;
}
};