SmartCubeV2/src/SmartCube/cubeButtons.h
2024-11-19 08:16:20 +01:00

106 lines
4.5 KiB
C

extern Adafruit_SSD1306 display; // Reference to the OLED display object
bool is_display_off = false; // State variable to track display on/off status
int buttonDebounceDelay = 50; // Debounce delay in milliseconds
int buttonLongPressDelay = 2000; // Long press threshold in milliseconds
void cubeButtonHandler() {
unsigned long currentMillis = millis(); // Get the current time in milliseconds
// Track the start times of button presses
static unsigned long leftPressStart = 0;
static unsigned long middlePressStart = 0;
static unsigned long rightPressStart = 0;
// Track if a beep has already been played for each button to avoid repeated beeping
static bool leftBeeped = false;
static bool middleBeeped = false;
static bool rightBeeped = false;
// Check if each button is currently pressed
bool leftPressed = (digitalRead(PIN_BTN_L) == HIGH);
bool middlePressed = (digitalRead(PIN_BTN_M) == HIGH);
bool rightPressed = (digitalRead(PIN_BTN_R) == HIGH);
// Short press detection for left button
if (leftPressed) {
// Check if the button is held beyond the debounce delay
if ((currentMillis - leftPressStart > buttonDebounceDelay)) {
if (!leftBeeped) {
beep(1000); // Play beep for a short press
leftBeeped = true; // Mark as beeped to avoid repeat beeps
// Handle left short press action here
}
}
} else {
leftPressStart = currentMillis; // Reset timer when button is released
leftBeeped = false; // Reset beep flag for next press
}
// Short press detection for middle button
if (middlePressed) {
if ((currentMillis - middlePressStart > buttonDebounceDelay)) {
if (!middleBeeped) {
beep(1000); // Play beep for a short press
middleBeeped = true; // Mark as beeped to avoid repeat beeps
// Handle middle short press action here
}
}
} else {
middlePressStart = currentMillis; // Reset timer when button is released
middleBeeped = false; // Reset beep flag for next press
}
// Short press detection for right button
if (rightPressed) {
if ((currentMillis - rightPressStart > buttonDebounceDelay)) {
if (!rightBeeped) {
beep(1000); // Play beep for a short press
rightBeeped = true; // Mark as beeped to avoid repeat beeps
if (is_display_off) {
display.ssd1306_command(SSD1306_DISPLAYON); // Turn on the display
is_display_off = false; // Update display state
beep(1300); // Additional beep to confirm display is on
}
}
}
} else {
rightPressStart = currentMillis; // Reset timer when button is released
rightBeeped = false; // Reset beep flag for next press
}
// Long press detection for left button
if (leftPressed && (currentMillis - leftPressStart > buttonLongPressDelay)) {
if (!leftBeeped) {
beep(1000); // Play beep for a long press
leftBeeped = true; // Mark as beeped to avoid repeat beeps
// Handle left long press action here
}
}
// Long press detection for middle button
if (middlePressed && (currentMillis - middlePressStart > buttonLongPressDelay)) {
if (!middleBeeped) {
beep(1000); // Play beep for a long press
middleBeeped = true; // Mark as beeped to avoid repeat beeps
// Handle middle long press action here
}
}
// Long press detection for right button (with display control)
if (rightPressed && (currentMillis - rightPressStart > buttonLongPressDelay)) {
if (!is_display_off) { // Turn off the display if it's on
beep(1300); // Beep to indicate display turn-off
display.ssd1306_command(SSD1306_DISPLAYOFF); // Turn off the display
is_display_off = true; // Update display state
beep(1000); // Additional beep to confirm display is off
}
}
// Combined long press detection for left and middle buttons to restart device
if (leftPressed && middlePressed &&
(currentMillis - leftPressStart > buttonLongPressDelay) && (currentMillis - middlePressStart > buttonLongPressDelay)) {
ESP.restart(); // Restart device if both buttons are held long enough
}
}