Skip to content

Commit 1beed1e

Browse files
committed
update
1 parent 658b1c8 commit 1beed1e

2 files changed

Lines changed: 42 additions & 35 deletions

File tree

OneButton.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,18 @@ void ob_tick(OneButton_t *btn){
105105
}
106106

107107
// обработка шагов и вызов callback функции
108-
if (!btn->flags.no_callback && btn->callbackStepFunc && btn->flags.step_flag && (thisMls - btn->timer >= btn->step_timeout)) {
109-
btn->timer = thisMls;
110-
btn->callbackStepFunc();
108+
if (btn->flags.step_flag && (thisMls - btn->timer >= btn->step_timeout)) {
109+
if (!btn->flags.no_callback && btn->callbackStepFunc) {
110+
btn->timer = thisMls;
111+
btn->callbackStepFunc(btn->counter);
112+
} else if (!btn->flags.no_callback && btn->callbackFunc) {
113+
btn->timer = thisMls;
114+
btn->callbackFunc(bf_step);
115+
}
111116
}
112117

113118
// сброс накликивания
114-
if(btn->flags.counter_reset) {
119+
if (btn->flags.counter_reset) {
115120
btn->last_counter = 0;
116121
btn->flags.counter_flag = 0;
117122
btn->flags.counter_reset = 0;
@@ -130,7 +135,7 @@ void ob_resetStates(OneButton_t *btn){
130135
btn->last_counter = 0;
131136
}
132137

133-
void ob_clearFlags(OneButton_t *btn, uint8_t flags){
138+
void ob_clearFlags(OneButton_t *btn, ob_callback_flags flags){
134139

135140
if (flags & bf_press) btn->flags.isPress_f = 0;
136141
if (flags & bf_release) btn->flags.isRelease_f = 0;

OneButton.h

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,14 @@ extern "C" {
2020
#define _click_timeout 300
2121
#define _step_timeout 500
2222

23-
#define bf_press ((uint16_t)0x01)
24-
#define bf_release ((uint16_t)0x02)
25-
#define bf_single ((uint16_t)0x04)
26-
#define bf_holded ((uint16_t)0x08)
27-
#define bf_click ((uint16_t)0x10)
28-
#define bf_step ((uint16_t)0x20)
23+
typedef enum {
24+
bf_press = ((uint16_t)0x01),
25+
bf_release = ((uint16_t)0x02),
26+
bf_single = ((uint16_t)0x04),
27+
bf_holded = ((uint16_t)0x08),
28+
bf_click = ((uint16_t)0x10),
29+
bf_step = ((uint16_t)0x20)
30+
} ob_callback_flags;
2931

3032
typedef enum {
3133
OB_TICK_NORM=0,
@@ -49,8 +51,8 @@ typedef struct {
4951
} button_flags;
5052
#pragma pack(pop)
5153

52-
typedef void (*callbackFunction)(uint16_t flags);
53-
typedef void (*callbackStepFunction)(void);
54+
typedef void (*callbackFunction)(ob_callback_flags flags);
55+
typedef void (*callbackStepFunction)(uint8_t clicks);
5456

5557
typedef struct
5658
{
@@ -75,28 +77,28 @@ typedef struct
7577

7678
} OneButton_t;
7779

78-
void ob_init(OneButton_t *btn, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState NormState); // инициализация кнопки
79-
void ob_setTickMode(OneButton_t *btn, ob_tick_mode mode);
80-
void ob_tick(OneButton_t *btn);
81-
void ob_resetStates(OneButton_t *btn);
82-
void ob_clearFlags(OneButton_t *btn, uint8_t flags);
83-
84-
void ob_attach_callbackEvent(OneButton_t *btn, callbackFunction func);
85-
void ob_attach_callbackStep(OneButton_t *btn, callbackStepFunction func);
86-
void ob_detach_callbackEvent(OneButton_t *btn);
87-
void ob_detach_callbackStep(OneButton_t *btn);
88-
89-
uint8_t ob_isPress(OneButton_t *btn);
90-
uint8_t ob_isRelease(OneButton_t *btn);
91-
uint8_t ob_isClick(OneButton_t *btn);
92-
uint8_t ob_isHolded(OneButton_t *btn);
93-
uint8_t ob_isHold(OneButton_t *btn); //+
94-
95-
uint8_t ob_isSingle(OneButton_t *btn);
96-
uint8_t ob_isDouble(OneButton_t *btn);
97-
uint8_t ob_hasClicks(OneButton_t *btn);
98-
uint8_t ob_getClicks(OneButton_t *btn);
99-
uint8_t ob_getHoldClicks(OneButton_t *btn);
80+
void ob_init(OneButton_t *btn, GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState NormState); // инициализация структуры-кнопки
81+
void ob_setTickMode(OneButton_t *btn, ob_tick_mode mode); // (OB_TICK_NORM / OB_TICK_AUTO) ручной или автоматический опрос кнопки функцией ob_tick()
82+
void ob_tick(OneButton_t *btn); // опрос кнопки
83+
void ob_resetStates(OneButton_t *btn); // сбрасывает все is-флаги и счётчики
84+
void ob_clearFlags(OneButton_t *btn, ob_callback_flags flags); // сбрасывает все is-флаги, должно вызываться внутри callbackEvent функции
85+
86+
void ob_attach_callbackEvent(OneButton_t *btn, callbackFunction func); // подключить callback метод обработчика событий вида void callbackEvent(ob_callback_flags flags)
87+
void ob_attach_callbackStep(OneButton_t *btn, callbackStepFunction func); // подключить callback метод обработчика шагов вида void callbackStep(void)
88+
void ob_detach_callbackEvent(OneButton_t *btn); // отключает ранее установленный callback метод обработчика событий
89+
void ob_detach_callbackStep(OneButton_t *btn); // отключает ранее установленный callback метод обработчика шагов
90+
91+
uint8_t ob_isPress(OneButton_t *btn); // возвращает 1 при нажатии на кнопку. Сбрасывается после вызова
92+
uint8_t ob_isRelease(OneButton_t *btn); // возвращает 1 при отпускании кнопки. Сбрасывается после вызова
93+
uint8_t ob_isClick(OneButton_t *btn); // возвращает 1 при клике. Сбрасывается после вызова
94+
uint8_t ob_isHolded(OneButton_t *btn); // возвращает 1 при удержании дольше timeout. Сбрасывается после вызова
95+
uint8_t ob_isHold(OneButton_t *btn); // возвращает 1 при нажатой кнопке, не сбрасывается
96+
97+
uint8_t ob_isSingle(OneButton_t *btn); // возвращает 1 при одиночном клике. Сбрасывается после вызова
98+
uint8_t ob_isDouble(OneButton_t *btn); // возвращает 1 при двойном клике. Сбрасывается после вызова
99+
uint8_t ob_hasClicks(OneButton_t *btn); // проверка на наличие кликов. Сбрасывается после вызова
100+
uint8_t ob_getClicks(OneButton_t *btn); // вернуть количество кликов
101+
uint8_t ob_getHoldClicks(OneButton_t *btn); // вернуть количество кликов, предшествующее удерживанию
100102

101103
uint8_t ob_isStep(OneButton_t *btn, uint8_t clicks); //+
102104

0 commit comments

Comments
 (0)