feat: refine remote states and PRTS LCD refresh

- add remote NOT_READY/READY/PROTECT state flow and matching LED/status display

- speed up TFT hardware SPI DMA flush path and larger LVGL partial refresh buffer

- reduce page/menu redraw artifacts and center the PRTS status title
This commit is contained in:
TuxMonkey
2026-07-21 00:40:01 +08:00
parent 8671f84139
commit dc57b5152e
10 changed files with 230 additions and 67 deletions

View File

@@ -7,18 +7,43 @@
#include <stddef.h>
#include <stdint.h>
#define PRTS_LVGL_BUF_LINES 64U
#define PRTS_LVGL_BUF_LINES 80U
#define PRTS_DMA_BUFFER_ATTR __attribute__((section(".dma_buffer"), aligned(32)))
static lv_display_t *prts_display = NULL;
static uint8_t prts_lvgl_buf[TFT_LCD_W * PRTS_LVGL_BUF_LINES * 2U] PRTS_DMA_BUFFER_ATTR;
static volatile uint32_t prts_lvgl_frame_count = 0U;
static volatile bool prts_lvgl_pending_last_flush = false;
static uint32_t prts_lvgl_tick_get(void)
{
return HAL_GetTick();
}
static void prts_lvgl_finish_flush(lv_display_t *disp, bool is_last)
{
if (is_last)
{
prts_lvgl_frame_count++;
}
lv_display_flush_ready(disp);
}
static void prts_lvgl_dma_done(void *context, bool ok)
{
lv_display_t *disp = (lv_display_t *) context;
if (!ok)
{
prts_lvgl_pending_last_flush = false;
lv_display_flush_ready(disp);
return;
}
prts_lvgl_finish_flush(disp, prts_lvgl_pending_last_flush);
prts_lvgl_pending_last_flush = false;
}
static void prts_lvgl_flush(lv_display_t *disp, const lv_area_t *area, uint8_t *px_map)
{
int32_t area_width;
@@ -28,14 +53,12 @@ static void prts_lvgl_flush(lv_display_t *disp, const lv_area_t *area, uint8_t *
int32_t x2;
int32_t y2;
uint32_t pixel_count;
bool is_last_flush;
is_last_flush = lv_display_flush_is_last(disp);
if (area->x2 < 0 || area->y2 < 0 || area->x1 >= (int32_t) TFT_LCD_W || area->y1 >= (int32_t) TFT_LCD_H)
{
if (lv_display_flush_is_last(disp))
{
prts_lvgl_frame_count++;
}
lv_display_flush_ready(disp);
prts_lvgl_finish_flush(disp, is_last_flush);
return;
}
@@ -43,11 +66,7 @@ static void prts_lvgl_flush(lv_display_t *disp, const lv_area_t *area, uint8_t *
area_height = lv_area_get_height(area);
if (area_width <= 0 || area_height <= 0)
{
if (lv_display_flush_is_last(disp))
{
prts_lvgl_frame_count++;
}
lv_display_flush_ready(disp);
prts_lvgl_finish_flush(disp, is_last_flush);
return;
}
@@ -62,6 +81,12 @@ static void prts_lvgl_flush(lv_display_t *disp, const lv_area_t *area, uint8_t *
if (x1 == area->x1 && y1 == area->y1 && x2 == area->x2 && y2 == area->y2)
{
LCD_Address_Set((uint16_t) x1, (uint16_t) y1, (uint16_t) x2, (uint16_t) y2);
prts_lvgl_pending_last_flush = is_last_flush;
if (TFT_WriteColorDataDMA(px_map, pixel_count * 2U, prts_lvgl_dma_done, disp))
{
return;
}
prts_lvgl_pending_last_flush = false;
TFT_WriteColorData(px_map, pixel_count * 2U);
}
else
@@ -81,11 +106,7 @@ static void prts_lvgl_flush(lv_display_t *disp, const lv_area_t *area, uint8_t *
}
}
if (lv_display_flush_is_last(disp))
{
prts_lvgl_frame_count++;
}
lv_display_flush_ready(disp);
prts_lvgl_finish_flush(disp, is_last_flush);
}
uint32_t PRTS_LVGLPortGetFrameCount(void)