fixed button handler not reporting buttons correctly

This commit is contained in:
true 2024-10-25 18:40:55 -07:00
parent 56cd06876a
commit 6b84019e0b
2 changed files with 50 additions and 25 deletions

View File

@ -2,6 +2,29 @@
* Created on: Jul 27, 2024
*
* generic button handler like I do on most of my projects
*
*
* to use the buttons:
*
* - set REG_BTN_DEBOUNCE_TIME to desired debounce time in 5ms increments
* (default is set in BTN_DEBOUNCE)
*
* - set button flags for the buttons you want the interrupt line to respond
* to in REG_BTNx_INT_ENABLE for each button
* flags are BTN_PUSH / BTN_HOLD / BTN_RELEASE bits
*
* - enable button line interrupt if you want the interrupt line to go high
* when a button interrupt happens
* this is INT_BTN bit in REG_INTR_FLAGS
*
* - if using interrupts, check flag; clear the flag by writing BTN_INT bit
* to REG_INTR_FLAGS_CLEAR
*
* - read the button states from REG_BTN_PUSHED, REG_BTN_HELD, REG_BTN_RELEASED
* these registers are clear-on-read so will always have fresh information
*
* - alternatively, work the mask directly by reading REG_BTNx_MASK
*
*/
#include "btn.h"
@ -121,12 +144,12 @@ void btn_poll()
pushed = 0;
ignore = btn[i]._mask & BTN_IGNORE;
r = BTN_PORT->INDR & (1 << (btn[i]._pintype & BTN_PIN_MASK));
r = BTN_PORT->INDR & (1 << (btn[i]._pintype & BTN_PINTYPE_MASK));
// active low type buttons
if (!r && (btn[i]._pintype & BTN_ACTIVE_LO)) pushed = 1;
if (!r) pushed = 1;
// active high type buttons
if (r && !(btn[i]._pintype & BTN_ACTIVE_LO)) pushed = 1;
// if (r && !(btn[i]._pintype & BTN_ACTIVE_LO)) pushed = 1;
if (pushed) {
// hold counter
@ -175,6 +198,7 @@ void btn_poll()
}
}
// any button event with enabled interrupt flags will set button interrupt flag
if (set_interrupt) {
i2cs_append_flag(INT_BTN);
set_interrupt = 0;

View File

@ -14,37 +14,38 @@
#define BTN_COUNT 4
#define BTN_DEBOUNCE (12 >> 1) // debounce time in 2ms
#define BTN_COUNT 5
#define BTN_DEBOUNCE (30 / 5) // debounce time in 5ms increments
#define BTN_PORT GPIOC
#define BTN_MODE 0x80
#define BTN_PORT GPIOC
#define BTN_MODE 0x80
#define BTN_PULL_UP (1 << 0)
#define BTN_PULL_DOWN (1 << 16)
#define BTN_PULL_UP (1 << 0)
#define BTN_PULL_DOWN (1 << 16)
#define BTN_ACTIVE_LO 0xf1
#define BTN_PIN_MASK 0xf1
#define BTN_ACTIVE_LO 0xf1
#define BTN_PIN_MASK 0xf1
#define BTN_PINTYPE_MASK 0x0f
#define BTN1_PIN 4
#define BTN1_PUPD BTN_PULL_UP
#define BTN1_PIN 4
#define BTN1_PUPD BTN_PULL_UP
#define BTN2_PIN 5
#define BTN2_PUPD BTN_PULL_UP
#define BTN2_PIN 5
#define BTN2_PUPD BTN_PULL_UP
#define BTN3_PIN 6
#define BTN3_PUPD BTN_PULL_UP
#define BTN3_PIN 6
#define BTN3_PUPD BTN_PULL_UP
#define BTN4_PIN 7
#define BTN4_PUPD BTN_PULL_UP
#define BTN4_PIN 7
#define BTN4_PUPD BTN_PULL_UP
#define BTN5_PIN 0 // side button
#define BTN5_PUPD BTN_PULL_UP
#define BTN5_PIN 0 // side button
#define BTN5_PUPD BTN_PULL_UP
#define BTN_PUSH (1 << 0)
#define BTN_HOLD (1 << 1)
#define BTN_RELEASE (1 << 2)
#define BTN_IGNORE (1 << 3)
#define BTN_PUSH (1 << 0)
#define BTN_HOLD (1 << 1)
#define BTN_RELEASE (1 << 2)
#define BTN_IGNORE (1 << 3)