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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user