mirror of
https://github.com/usatiuk/cardboy.git
synced 2025-10-29 07:37:48 +01:00
63 lines
1.8 KiB
C++
63 lines
1.8 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);
|
|
}
|
|
}
|
|
|
|
BaseType_t PowerHelper::reset_slow_isr(BaseType_t* xHigherPriorityTaskWoken) {
|
|
_slow = false;
|
|
return xEventGroupSetBitsFromISR(_event_group, 1, xHigherPriorityTaskWoken);
|
|
}
|
|
|
|
static void wakeup(void* arg) {
|
|
BaseType_t xHigherPriorityTaskWoken, xResult;
|
|
|
|
xHigherPriorityTaskWoken = pdFALSE;
|
|
xResult = static_cast<PowerHelper*>(arg)->reset_slow_isr(&xHigherPriorityTaskWoken);
|
|
if (xResult != pdFAIL) {
|
|
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
|
|
};
|
|
}
|
|
|
|
PowerHelper::PowerHelper() : _event_group(xEventGroupCreate()) { 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(EXP_INT, wakeup, this);
|
|
}
|