mirror of
https://gitee.com/dlmu-cone/tronone-h7-scaffold
synced 2026-07-24 11:37:44 +08:00
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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user