wake up button

This commit is contained in:
2025-03-04 00:46:49 +01:00
parent e0c55d5da6
commit dd661e10fd
6 changed files with 86 additions and 20 deletions

View File

@@ -5,16 +5,22 @@
#ifndef POWER_HELPER_HPP
#define POWER_HELPER_HPP
#include "freertos/FreeRTOS.h"
class PowerHelper {
public:
static PowerHelper& get();
bool is_slow();
bool is_slow() const;
void set_slow(bool slow);
void reset_slow_isr(); // FIXME:
void delay(int slow_ms, int normal_ms);
private:
bool _slow = false;
PowerHelper();
bool _slow = false;
EventGroupHandle_t _event_group;
};

View File

@@ -4,6 +4,8 @@
#include "bat_mon.hpp"
#include <power_helper.hpp>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
@@ -67,7 +69,7 @@ void BatMon::pooler() {
current /= 50;
current /= 4;
_current = current;
vTaskDelay(1 * 1000 / portTICK_PERIOD_MS);
PowerHelper::get().delay(10000, 1000);
}
}

View File

@@ -21,8 +21,6 @@ Buttons& Buttons::get() {
static void start_pooler(void* arg) { static_cast<Buttons*>(arg)->pooler(); }
static void wake(void* arg) { PowerHelper::get().set_slow(false); }
Buttons::Buttons() {
ESP_ERROR_CHECK(gpio_reset_pin(SHR_OUT));
ESP_ERROR_CHECK(gpio_reset_pin(SHR_CLK));
@@ -32,11 +30,6 @@ Buttons::Buttons() {
ESP_ERROR_CHECK(gpio_set_direction(SHR_SH, GPIO_MODE_OUTPUT));
ESP_ERROR_CHECK(gpio_set_direction(SHR_CLK, GPIO_MODE_OUTPUT));
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_NEGEDGE));
gpio_isr_handler_add(DIRECT_BTN, &wake, nullptr);
xTaskCreate(&start_pooler, "ButtonsPooler", 2048, this, 1, &_pooler_task);
}
@@ -60,7 +53,7 @@ void Buttons::pooler() {
ESP_ERROR_CHECK(gpio_set_level(SHR_CLK, 1));
}
_current = new_val;
vTaskDelay((PowerHelper::get().is_slow() ? 1000 : 100) / portTICK_PERIOD_MS);
PowerHelper::get().delay(10000, 100);
}
}
uint8_t Buttons::get_pressed() { return _current; }

View File

@@ -25,6 +25,8 @@
#include "driver/spi_master.h"
#include "i2c_global.hpp"
#include <driver/gpio.h>
#include <esp_sleep.h>
#include <memory>
#include <power_helper.hpp>
#include <shutdowner.hpp>
@@ -39,6 +41,10 @@ extern "C" void app_main() {
.max_freq_mhz = CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ, .min_freq_mhz = 16, .light_sleep_enable = true};
ESP_ERROR_CHECK(esp_pm_configure(&pm_config));
printf("Hello world!\n");
// TODO: Where to put that?
ESP_ERROR_CHECK(esp_sleep_enable_gpio_wakeup());
ESP_ERROR_CHECK(gpio_install_isr_service(0));
PowerHelper::get();
Shutdowner::get();
Buttons::get();
I2cGlobal::get();
@@ -62,9 +68,7 @@ extern "C" void app_main() {
// printf("Voltage: %f\n", BatMon::get_voltage());
DispTools::get().clear();
tty.reset();
bool slow = PowerHelper::get().is_slow();
tty.fmt("{:.1f}mA {:.1f}V {:.1f}mAh {}", BatMon::get().get_current(), BatMon::get().get_voltage(),
BatMon::get().get_charge(), slow ? "S" : "");
uint8_t pressed = Buttons::get().get_pressed();
if (pressed & L3)
rx -= 5;
@@ -75,7 +79,7 @@ extern "C" void app_main() {
if (pressed & R4)
rx += 5;
if (pressed == 0 && !slow)
if (pressed == 0 && !PowerHelper::get().is_slow())
lastmove++;
else if (pressed != 0) {
lastmove = 0;
@@ -87,6 +91,10 @@ extern "C" void app_main() {
PowerHelper::get().set_slow(true);
}
bool slow = PowerHelper::get().is_slow();
tty.fmt("{:.1f}mA {:.1f}V {:.1f}mAh {}", BatMon::get().get_current(), BatMon::get().get_voltage(),
BatMon::get().get_charge(), slow ? "S" : "");
if (rx < 30)
rx = 30;
if (rx > 370)
@@ -99,7 +107,7 @@ extern "C" void app_main() {
DispTools::get().draw_circle(rx, ry, 20);
// printf("Restarting in %d seconds...\n", i);
DispTools::get().draw_to_display();
vTaskDelay((PowerHelper::get().is_slow() ? 1000 : 30) / portTICK_PERIOD_MS);
PowerHelper::get().delay(10000, 30);
}
// printf("Restarting now.\n");
// fflush(stdout);

View File

@@ -4,9 +4,66 @@
#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() { return _slow; }
void PowerHelper::set_slow(bool slow) { _slow = slow; }
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);
}
}

View File

@@ -29,9 +29,9 @@ Shutdowner::Shutdowner() {
ESP_ERROR_CHECK(gpio_set_level(PWR_KILL, 1));
ESP_ERROR_CHECK(gpio_set_pull_mode(PWR_INT, GPIO_FLOATING));
ESP_ERROR_CHECK(gpio_set_intr_type(PWR_INT, GPIO_INTR_LOW_LEVEL));
ESP_ERROR_CHECK(esp_sleep_enable_gpio_wakeup());
// ESP_ERROR_CHECK(esp_sleep_enable_gpio_wakeup());
ESP_ERROR_CHECK(gpio_wakeup_enable(PWR_INT, GPIO_INTR_LOW_LEVEL));
ESP_ERROR_CHECK(gpio_install_isr_service(0));
// ESP_ERROR_CHECK(gpio_install_isr_service(0));
ESP_ERROR_CHECK(gpio_hold_en(PWR_KILL));
gpio_isr_handler_add(PWR_INT, shutdown, nullptr);
}