Add software LiPo UV protection with energy-save boot.
Detect under-voltage on GPIO1/11, persist UV state in NVS, enter a minimal power mode without ESP-NOW, and recover after charge; expose LED mode 6 battery-low for host testing via goTool. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include "esp_log.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "led_strip.h"
|
||||
#include <stdint.h>
|
||||
|
||||
@@ -23,8 +24,12 @@ static led_strip_handle_t led_ring;
|
||||
#define LED_RING_FIND_ME_ON_MS 300
|
||||
#define LED_RING_FIND_ME_OFF_MS 150
|
||||
#define LED_RING_FIND_ME_BLINKS_PER_COLOR 3
|
||||
#define LED_RING_BATTERY_LOW_R 255
|
||||
#define LED_RING_BATTERY_LOW_G 0
|
||||
#define LED_RING_BATTERY_LOW_B 0
|
||||
|
||||
static QueueHandle_t led_queue;
|
||||
static SemaphoreHandle_t s_battery_low_done;
|
||||
|
||||
// Led Matrix Maps
|
||||
const uint8_t d0[] = {46, 47, 60, 61, 62, 75, 78, 79,
|
||||
@@ -145,6 +150,22 @@ void vTaskLedRing(void *pvParameters) {
|
||||
}
|
||||
}
|
||||
continue;
|
||||
} else if (cmd.mode == LED_CMD_BATTERY_LOW) {
|
||||
uint8_t r = LED_RING_BATTERY_LOW_R;
|
||||
uint8_t g = LED_RING_BATTERY_LOW_G;
|
||||
uint8_t b = LED_RING_BATTERY_LOW_B;
|
||||
led_ring_scale_rgb(&r, &g, &b, LED_RING_BATTERY_LOW_INTENSITY);
|
||||
for (uint32_t i = 0; i < LED_RING_BATTERY_LOW_LEDS; i++) {
|
||||
led_strip_set_pixel(led_ring, i, r, g, b);
|
||||
}
|
||||
led_strip_refresh(led_ring);
|
||||
vTaskDelay(pdMS_TO_TICKS(LED_RING_BATTERY_LOW_HOLD_MS));
|
||||
led_strip_clear(led_ring);
|
||||
led_strip_refresh(led_ring);
|
||||
if (s_battery_low_done != NULL) {
|
||||
xSemaphoreGive(s_battery_low_done);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
led_strip_refresh(led_ring);
|
||||
}
|
||||
@@ -153,6 +174,7 @@ void vTaskLedRing(void *pvParameters) {
|
||||
|
||||
void led_ring_init(void) {
|
||||
led_queue = xQueueCreate(10, sizeof(led_command_t));
|
||||
s_battery_low_done = xSemaphoreCreateBinary();
|
||||
xTaskCreate(vTaskLedRing, "led_task", 4096, NULL, 5, NULL);
|
||||
}
|
||||
|
||||
@@ -224,3 +246,13 @@ void led_ring_find_me(void) {
|
||||
led_command_t cmd = {.mode = LED_CMD_FIND_ME};
|
||||
led_ring_send_command(&cmd);
|
||||
}
|
||||
|
||||
void led_ring_show_battery_low(void) {
|
||||
if (led_queue == NULL || s_battery_low_done == NULL) {
|
||||
return;
|
||||
}
|
||||
(void)xSemaphoreTake(s_battery_low_done, 0);
|
||||
led_command_t cmd = {.mode = LED_CMD_BATTERY_LOW};
|
||||
led_ring_send_command(&cmd);
|
||||
(void)xSemaphoreTake(s_battery_low_done, portMAX_DELAY);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user