Untitled
unknown
c_cpp
a year ago
3.8 kB
21
Indexable
#include "button_handler.h"
#include "fume_eliminator.h"
#include "stm32l4xx_hal.h" // Assuming you're using the HAL library
// Structure to hold the GPIO pin and port associated with each button
typedef struct {
GPIO_TypeDef* port;
uint16_t pin;
} ButtonConfig;
// Array mapping button IDs to their respective GPIO ports and pins
static ButtonConfig buttonConfigs[BUTTON_COUNT] = {
{GPIOA, GPIO_PIN_0}, // BUTTON_ON_OFF
{GPIOA, GPIO_PIN_1}, // BUTTON_SETTINGS
{GPIOA, GPIO_PIN_2}, // BUTTON_FILTER_CLEAN
{GPIOA, GPIO_PIN_3}, // BUTTON_F1
{GPIOA, GPIO_PIN_4}, // BUTTON_F2
{GPIOA, GPIO_PIN_5}, // BUTTON_F3
{GPIOA, GPIO_PIN_6}, // BUTTON_FAN
{GPIOA, GPIO_PIN_7}, // BUTTON_PLUS
{GPIOA, GPIO_PIN_8}, // BUTTON_MINUS
};
// External reference to the button queue created in fume_eliminator.c
extern osMessageQueueId_t buttonQueueHandle;
static uint32_t buttonPressStartTimes[BUTTON_COUNT] = {0}; // To store the start time of each button press
static bool buttonStates[BUTTON_COUNT] = {false}; // Array to track the state of each button (pressed/released)
void ButtonHandler_Init(void) {
// Initialize the button handling system
for (int i = 0; i < BUTTON_COUNT; i++) {
buttonStates[i] = false; // Initialize all button states to released
}
}
void ButtonHandler_Task(void *argument) {
for (;;) {
for (int i = 0; i < BUTTON_COUNT; i++) {
if (IsButtonPressed((ButtonId)i)) {
if (!buttonStates[i]) {
// Button was just pressed
buttonStates[i] = true;
buttonPressStartTimes[i] = HAL_GetTick();
}
// Get the type of press (short, long, or ongoing)
PressType pressType = GetPressType(i);
if (pressType == PRESS_LONG) {
// Handle long press without resetting the state to allow continuous actions
ButtonEventMessage msg;
msg.buttonId = i;
msg.pressType = PRESS_LONG;
osMessageQueuePut(buttonQueueHandle, &msg, 0, 0);
}
// If pressType is PRESS_ONGOING, continue holding, no action needed until release
} else if (buttonStates[i]) { // Only true if the button was previously pressed
// Button was just released
ButtonEventMessage msg;
msg.buttonId = i;
PressType pressType = GetPressType(i);
if (pressType == PRESS_SHORT) {
msg.pressType = PRESS_SHORT;
} else if (pressType == PRESS_LONG) {
msg.pressType = PRESS_LONG; // Handle as long press if it was held long enough
}
osMessageQueuePut(buttonQueueHandle, &msg, 0, 0);
// Now reset the button state
buttonStates[i] = false;
}
}
// Small delay to prevent task starvation
osDelay(10);
}
}
uint8_t IsButtonPressed(ButtonId buttonId) {
// Check if the button is pressed by reading the GPIO pin
return HAL_GPIO_ReadPin(buttonConfigs[buttonId].port, buttonConfigs[buttonId].pin) == GPIO_PIN_RESET;
}
PressType GetPressType(uint8_t buttonIndex) {
uint32_t pressDuration = HAL_GetTick() - buttonPressStartTimes[buttonIndex];
if (IsButtonPressed((ButtonId)buttonIndex)) {
if (pressDuration >= LONG_PRESS_THRESHOLD) {
return PRESS_LONG;
} else {
return PRESS_ONGOING;
}
} else if (pressDuration > SHORT_PRESS_THRESHOLD) {
return PRESS_SHORT;
}
return PRESS_NONE;
}
Editor is loading...
Leave a Comment