diff --git a/source/buttons.cpp b/source/buttons.cpp index 1153c4f..0b40a68 100644 --- a/source/buttons.cpp +++ b/source/buttons.cpp @@ -5,7 +5,10 @@ extern BLEHidAdafruit blehid; -static uint8_t physBtnMask = 0; // bitmask of currently-pressed physical buttons +static uint8_t physBtnMask = 0; +static uint8_t rawMaskPrev = 0; +static unsigned long debounceMs = 0; +static const unsigned long DEBOUNCE_MS = 20; // Setup void setupPhysicalButtons() { @@ -36,16 +39,25 @@ void setupPhysicalButtons() { void processPhysicalButtons() { if (!Bluefruit.connected()) return; - uint8_t newMask = 0; - if (BTN_LEFT_PIN != BTN_PIN_NONE && digitalRead(BTN_LEFT_PIN) == LOW) newMask |= MOUSE_BUTTON_LEFT; - if (BTN_RIGHT_PIN != BTN_PIN_NONE && digitalRead(BTN_RIGHT_PIN) == LOW) newMask |= MOUSE_BUTTON_RIGHT; - if (BTN_MIDDLE_PIN != BTN_PIN_NONE && digitalRead(BTN_MIDDLE_PIN) == LOW) newMask |= MOUSE_BUTTON_MIDDLE; + uint8_t rawMask = 0; + if (BTN_LEFT_PIN != BTN_PIN_NONE && digitalRead(BTN_LEFT_PIN) == LOW) rawMask |= MOUSE_BUTTON_LEFT; + if (BTN_RIGHT_PIN != BTN_PIN_NONE && digitalRead(BTN_RIGHT_PIN) == LOW) rawMask |= MOUSE_BUTTON_RIGHT; + if (BTN_MIDDLE_PIN != BTN_PIN_NONE && digitalRead(BTN_MIDDLE_PIN) == LOW) rawMask |= MOUSE_BUTTON_MIDDLE; - if (newMask != physBtnMask) { + if (rawMask != rawMaskPrev) { rawMaskPrev = rawMask; debounceMs = millis(); } + if (rawMask != physBtnMask && (millis() - debounceMs >= DEBOUNCE_MS)) { + uint8_t newMask = rawMask; + uint8_t pressed = newMask & ~physBtnMask; // bits that just went down + uint8_t released = physBtnMask & ~newMask; // bits that just went up physBtnMask = newMask; if (physBtnMask) blehid.mouseButtonPress(physBtnMask); else blehid.mouseButtonRelease(); - Serial.print("[BTN] mask=0x"); Serial.println(physBtnMask, HEX); + if (pressed & MOUSE_BUTTON_LEFT) Serial.println("[BTN] L press"); + if (pressed & MOUSE_BUTTON_RIGHT) Serial.println("[BTN] R press"); + if (pressed & MOUSE_BUTTON_MIDDLE) Serial.println("[BTN] M press"); + if (released & MOUSE_BUTTON_LEFT) Serial.println("[BTN] L release"); + if (released & MOUSE_BUTTON_RIGHT) Serial.println("[BTN] R release"); + if (released & MOUSE_BUTTON_MIDDLE) Serial.println("[BTN] M release"); } } diff --git a/source/config.h b/source/config.h index 7058c34..f7b0c65 100644 --- a/source/config.h +++ b/source/config.h @@ -60,7 +60,7 @@ // Physical button pin assignments (hardcoded - set to 0xFF to disable a button) // Valid pin numbers: 0-10 (Arduino D0-D10 on XIAO nRF52840 Sense) #define BTN_PIN_NONE 0xFF -#define BTN_LEFT_PIN BTN_PIN_NONE // e.g. 0 for D0 +#define BTN_LEFT_PIN 1 // D1, active-low to GND #define BTN_RIGHT_PIN BTN_PIN_NONE // e.g. 1 for D1 #define BTN_MIDDLE_PIN BTN_PIN_NONE // e.g. 2 for D2