mirror of
https://github.com/usatiuk/cardboy.git
synced 2025-10-28 23:27:49 +01:00
71 lines
2.2 KiB
C++
71 lines
2.2 KiB
C++
//
|
|
// Created by Stepan Usatiuk on 03.03.2025.
|
|
//
|
|
|
|
#include "power_helper.hpp"
|
|
|
|
#include <config.hpp>
|
|
#include <driver/gpio.h>
|
|
#include <esp_sleep.h>
|
|
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/task.h"
|
|
|
|
PowerHelper& PowerHelper::get() {
|
|
static PowerHelper powerHelper;
|
|
return powerHelper;
|
|
}
|
|
bool PowerHelper::is_slow() const { return _slow; }
|
|
void PowerHelper::set_slow(bool slow) {
|
|
_slow = slow;
|
|
if (_slow) {
|
|
xEventGroupClearBits(_event_group, 1);
|
|
} else {
|
|
xEventGroupSetBits(_event_group, 1);
|
|
}
|
|
}
|
|
|
|
void PowerHelper::reset_slow_isr() {
|
|
BaseType_t xHigherPriorityTaskWoken, xResult;
|
|
|
|
xHigherPriorityTaskWoken = pdFALSE;
|
|
|
|
_slow = false;
|
|
xResult = xEventGroupSetBitsFromISR(_event_group, 1, &xHigherPriorityTaskWoken);
|
|
|
|
if (xResult != pdFAIL) {
|
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
|
}
|
|
}
|
|
|
|
static void wakeup(void* arg) { static_cast<PowerHelper*>(arg)->reset_slow_isr(); }
|
|
|
|
PowerHelper::PowerHelper() : _event_group(xEventGroupCreate()) {
|
|
ESP_ERROR_CHECK(gpio_reset_pin(DIRECT_BTN));
|
|
ESP_ERROR_CHECK(gpio_set_direction(DIRECT_BTN, GPIO_MODE_INPUT));
|
|
ESP_ERROR_CHECK(gpio_set_pull_mode(DIRECT_BTN, GPIO_FLOATING));
|
|
ESP_ERROR_CHECK(gpio_set_intr_type(DIRECT_BTN, GPIO_INTR_HIGH_LEVEL));
|
|
ESP_ERROR_CHECK(gpio_wakeup_enable(DIRECT_BTN, GPIO_INTR_HIGH_LEVEL));
|
|
// ESP_ERROR_CHECK(gpio_install_isr_service(0));
|
|
// gpio_isr_handler_add(DIRECT_BTN, wakeup, this);
|
|
|
|
set_slow(false);
|
|
}
|
|
|
|
void PowerHelper::delay(int slow_ms, int normal_ms) {
|
|
if (is_slow()) {
|
|
auto cur_ticks = xTaskGetTickCount();
|
|
TickType_t to_wait = slow_ms / portTICK_PERIOD_MS;
|
|
TickType_t to_wait_normal = normal_ms / portTICK_PERIOD_MS;
|
|
auto expected_ticks = cur_ticks + to_wait_normal;
|
|
xEventGroupWaitBits(_event_group, 1, pdFALSE, pdTRUE, to_wait);
|
|
auto realTicks = xTaskGetTickCount();
|
|
if (realTicks < expected_ticks) {
|
|
vTaskDelay(expected_ticks - realTicks);
|
|
}
|
|
} else {
|
|
vTaskDelay(normal_ms / portTICK_PERIOD_MS);
|
|
}
|
|
}
|
|
void PowerHelper::install_isr() { gpio_isr_handler_add(DIRECT_BTN, wakeup, this); }
|