forked from btclock/btclock_v3
64 lines
1.8 KiB
C++
64 lines
1.8 KiB
C++
|
#include "button_handler.hpp"
|
||
|
|
||
|
TaskHandle_t buttonTaskHandle = NULL;
|
||
|
const TickType_t debounceDelay = pdMS_TO_TICKS(50);
|
||
|
TickType_t lastDebounceTime = 0;
|
||
|
|
||
|
void buttonTask(void *parameter)
|
||
|
{
|
||
|
while (1)
|
||
|
{
|
||
|
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
|
||
|
TickType_t currentTime = xTaskGetTickCount();
|
||
|
if ((currentTime - lastDebounceTime) >= debounceDelay)
|
||
|
{
|
||
|
lastDebounceTime = currentTime;
|
||
|
|
||
|
if (!digitalRead(MCP_INT_PIN))
|
||
|
{
|
||
|
uint pin = mcp.getLastInterruptPin();
|
||
|
|
||
|
Serial.printf("Button pressed: %d", pin);
|
||
|
// switch (pin)
|
||
|
// {
|
||
|
// case 3:
|
||
|
// toggleScreenTimer();
|
||
|
// break;
|
||
|
// case 2:
|
||
|
// nextScreen();
|
||
|
// break;
|
||
|
// case 1:
|
||
|
// previousScreen();
|
||
|
// break;
|
||
|
// case 0:
|
||
|
// showNetworkSettings();
|
||
|
// break;
|
||
|
// }
|
||
|
}
|
||
|
mcp.clearInterrupts();
|
||
|
// Very ugly, but for some reason this is necessary
|
||
|
while (!digitalRead(MCP_INT_PIN))
|
||
|
{
|
||
|
mcp.clearInterrupts();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void IRAM_ATTR handleButtonInterrupt()
|
||
|
{
|
||
|
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
|
||
|
xTaskNotifyFromISR(buttonTaskHandle, 0, eNoAction, &xHigherPriorityTaskWoken);
|
||
|
if (xHigherPriorityTaskWoken == pdTRUE)
|
||
|
{
|
||
|
portYIELD_FROM_ISR();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void setupButtonTask()
|
||
|
{
|
||
|
xTaskCreate(buttonTask, "ButtonTask", 4096, NULL, tskIDLE_PRIORITY, &buttonTaskHandle); // Create the FreeRTOS task
|
||
|
// Use interrupt instead of task
|
||
|
attachInterrupt(MCP_INT_PIN, handleButtonInterrupt, CHANGE);
|
||
|
}
|