#include "buttons.h" #ifdef FEATURE_PHYSICAL_BUTTONS #include extern BLEHidAdafruit blehid; static uint8_t physBtnMask = 0; // bitmask of currently-pressed physical buttons // Setup void setupPhysicalButtons() { // Release any held physical buttons before reconfiguring if (physBtnMask && Bluefruit.connected()) { blehid.mouseButtonRelease(); } physBtnMask = 0; if (cfg.btnLeftPin != BTN_PIN_NONE) pinMode(cfg.btnLeftPin, INPUT_PULLUP); if (cfg.btnRightPin != BTN_PIN_NONE) pinMode(cfg.btnRightPin, INPUT_PULLUP); if (cfg.btnMiddlePin != BTN_PIN_NONE) pinMode(cfg.btnMiddlePin, INPUT_PULLUP); bool any = (cfg.btnLeftPin != BTN_PIN_NONE) || (cfg.btnRightPin != BTN_PIN_NONE) || (cfg.btnMiddlePin != BTN_PIN_NONE); if (any) { Serial.print("[BTN] L="); cfg.btnLeftPin == BTN_PIN_NONE ? Serial.print("--") : Serial.print(cfg.btnLeftPin); Serial.print(" R="); cfg.btnRightPin == BTN_PIN_NONE ? Serial.print("--") : Serial.print(cfg.btnRightPin); Serial.print(" M="); cfg.btnMiddlePin == BTN_PIN_NONE ? Serial.print("--") : Serial.print(cfg.btnMiddlePin); Serial.println(); } } // Poll and report // Called every loop iteration (before rate limiter) for immediate response. // Uses active-low logic: INPUT_PULLUP, button connects pin to GND. void processPhysicalButtons() { if (!Bluefruit.connected()) return; uint8_t newMask = 0; if (cfg.btnLeftPin != BTN_PIN_NONE && digitalRead(cfg.btnLeftPin) == LOW) newMask |= MOUSE_BUTTON_LEFT; if (cfg.btnRightPin != BTN_PIN_NONE && digitalRead(cfg.btnRightPin) == LOW) newMask |= MOUSE_BUTTON_RIGHT; if (cfg.btnMiddlePin != BTN_PIN_NONE && digitalRead(cfg.btnMiddlePin) == LOW) newMask |= MOUSE_BUTTON_MIDDLE; if (newMask != physBtnMask) { physBtnMask = newMask; if (physBtnMask) blehid.mouseButtonPress(physBtnMask); else blehid.mouseButtonRelease(); Serial.print("[BTN] mask=0x"); Serial.println(physBtnMask, HEX); } } #endif // FEATURE_PHYSICAL_BUTTONS