53 lines
2.4 KiB
C++
53 lines
2.4 KiB
C++
#include "buttons.h"
|
|
|
|
#ifdef FEATURE_PHYSICAL_BUTTONS
|
|
#include <bluefruit.h>
|
|
|
|
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
|