added debounce logic for hardware buttons
This commit is contained in:
parent
15d85ce2eb
commit
8b7bd91817
|
@ -1,10 +1,14 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <string.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include "scode.h"
|
#include "scode.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "msg_queue.h"
|
#include "msg_queue.h"
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
#include "time_func.h"
|
||||||
|
|
||||||
|
#define DEBOUNCE_BUTTON_MSEC 350
|
||||||
|
|
||||||
PMSG_QUEUE Sys_Queue = NULL;
|
PMSG_QUEUE Sys_Queue = NULL;
|
||||||
|
|
||||||
|
@ -16,6 +20,10 @@ static void *input_thread(void *arg)
|
||||||
{
|
{
|
||||||
UINT32 st, down, up, mask;
|
UINT32 st, down, up, mask;
|
||||||
UINT_PTR attr;
|
UINT_PTR attr;
|
||||||
|
TIMESTAMP now;
|
||||||
|
TIMESTAMP button_event_ok[GPIO_BUTTON_COUNT];
|
||||||
|
|
||||||
|
memset(button_event_ok, 0, GPIO_BUTTON_COUNT * sizeof(TIMESTAMP));
|
||||||
|
|
||||||
while (running)
|
while (running)
|
||||||
{
|
{
|
||||||
|
@ -23,12 +31,18 @@ static void *input_thread(void *arg)
|
||||||
st = Gpio_read_buttons();
|
st = Gpio_read_buttons();
|
||||||
if (st != last_bstate)
|
if (st != last_bstate)
|
||||||
{
|
{
|
||||||
|
now = Time_since_start();
|
||||||
up = last_bstate & ~st;
|
up = last_bstate & ~st;
|
||||||
down = st & ~last_bstate;
|
down = st & ~last_bstate;
|
||||||
for (attr = 1, mask = GRB_STATE_BUTTON1; attr <= GPIO_BUTTON_COUNT; attr++, mask <<= 1)
|
for (attr = 1, mask = GRB_STATE_BUTTON1; attr <= GPIO_BUTTON_COUNT; attr++, mask <<= 1)
|
||||||
{
|
{
|
||||||
|
if (now < button_event_ok[attr - 1])
|
||||||
|
continue;
|
||||||
if (up & mask)
|
if (up & mask)
|
||||||
|
{
|
||||||
|
button_event_ok[attr - 1] = now + DEBOUNCE_BUTTON_MSEC;
|
||||||
Mq_post1(Sys_Queue, 0, WM_HWBUTTONUP, attr);
|
Mq_post1(Sys_Queue, 0, WM_HWBUTTONUP, attr);
|
||||||
|
}
|
||||||
else if (down & mask)
|
else if (down & mask)
|
||||||
Mq_post1(Sys_Queue, 0, WM_HWBUTTONDOWN, attr);
|
Mq_post1(Sys_Queue, 0, WM_HWBUTTONDOWN, attr);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user