mirror of
https://github.com/stasenso/rp_pico_display_engine.git
synced 2026-06-26 21:32:41 +03:00
display: simplify safe buffer contract and update Thermometr example
This commit is contained in:
@@ -109,12 +109,11 @@ int main()
|
|||||||
}
|
}
|
||||||
frame_tick_due = false; // Сбрасываем флаг и разрешаем обработать ровно один кадр на этот тик.
|
frame_tick_due = false; // Сбрасываем флаг и разрешаем обработать ровно один кадр на этот тик.
|
||||||
|
|
||||||
if (!display_ready()) // Если прошлый кадр все еще передается DMA на дисплей.
|
uint16_t* buf = display_try_acquire_draw_buffer(); // Пытаемся неблокирующе получить draw-буфер.
|
||||||
|
if (buf == NULL) // Если в SAFE+1 DMA еще занят, просто пропускаем тик кадра.
|
||||||
{
|
{
|
||||||
continue; // Пропускаем этот кадр, не накапливая задержку.
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t* buf = display_get_draw_buffer(); // Получаем буфер, в который разрешено рисовать текущий кадр.
|
|
||||||
render_begin(&rc, buf, WIDTH, HEIGHT); // Привязываем контекст рендера к буферу и размерам экрана.
|
render_begin(&rc, buf, WIDTH, HEIGHT); // Привязываем контекст рендера к буферу и размерам экрана.
|
||||||
|
|
||||||
render_clear(&rc, RGB16(9,19,9)); // Очищаем кадр темно-зеленым фоном.
|
render_clear(&rc, RGB16(9,19,9)); // Очищаем кадр темно-зеленым фоном.
|
||||||
|
|||||||
@@ -100,13 +100,24 @@ void display_init(const display_config_t* cfg);
|
|||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Буфер для рисования.
|
* Неблокирующая попытка получить буфер для рисования.
|
||||||
*
|
*
|
||||||
* SAFE + 1 буфер:
|
* Возвращает NULL если буфер сейчас недоступен
|
||||||
* может блокировать пока DMA активен.
|
* (например, SAFE + 1 буфер и DMA активен).
|
||||||
*
|
*/
|
||||||
* RAW:
|
uint16_t* display_try_acquire_draw_buffer(void);
|
||||||
* никогда не блокирует.
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Блокирующее получение буфера для рисования.
|
||||||
|
*/
|
||||||
|
uint16_t* display_acquire_draw_buffer_blocking(void);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Совместимость со старым API.
|
||||||
|
* Начиная с текущей версии работает как non-blocking alias:
|
||||||
|
* эквивалентно display_try_acquire_draw_buffer().
|
||||||
*/
|
*/
|
||||||
uint16_t* display_get_draw_buffer(void);
|
uint16_t* display_get_draw_buffer(void);
|
||||||
|
|
||||||
|
|||||||
+26
-3
@@ -286,14 +286,14 @@ void display_init(const display_config_t* cfg)
|
|||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
uint16_t* display_get_draw_buffer(void)
|
uint16_t* display_try_acquire_draw_buffer(void)
|
||||||
{
|
{
|
||||||
if (ctx.mode == DISPLAY_MODE_SAFE &&
|
if (ctx.mode == DISPLAY_MODE_SAFE &&
|
||||||
ctx.buffer_count == 1)
|
ctx.buffer_count == 1)
|
||||||
{
|
{
|
||||||
while (ctx.dma_busy)
|
if (ctx.dma_busy)
|
||||||
{
|
{
|
||||||
/* активное ожидание */
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,6 +301,29 @@ uint16_t* display_get_draw_buffer(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
uint16_t* display_acquire_draw_buffer_blocking(void)
|
||||||
|
{
|
||||||
|
uint16_t* buf = NULL;
|
||||||
|
|
||||||
|
while (buf == NULL)
|
||||||
|
{
|
||||||
|
buf = display_try_acquire_draw_buffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
|
uint16_t* display_get_draw_buffer(void)
|
||||||
|
{
|
||||||
|
return display_try_acquire_draw_buffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------ */
|
/* ------------------------------------------------------------ */
|
||||||
|
|
||||||
uint16_t* display_get_scanout_buffer(void)
|
uint16_t* display_get_scanout_buffer(void)
|
||||||
|
|||||||
Reference in New Issue
Block a user