mirror of
https://github.com/stasenso/rp_pico_display_engine.git
synced 2026-06-26 21:32:41 +03:00
125 lines
4.3 KiB
C
125 lines
4.3 KiB
C
#pragma once
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
/* ============================================================
|
|
=== Конфигурация времени компиляции
|
|
============================================================ */
|
|
|
|
/*
|
|
* Максимальное количество буферов,
|
|
* доступное в данной сборке.
|
|
*
|
|
* RP2040: обычно 1
|
|
* RP2350: можно 2
|
|
*/
|
|
#ifndef DISPLAY_MAX_BUFFERS
|
|
#define DISPLAY_MAX_BUFFERS 2
|
|
#endif
|
|
|
|
|
|
/* ============================================================
|
|
=== Режимы
|
|
============================================================ */
|
|
|
|
typedef enum
|
|
{
|
|
/* Безопасный режим: движок сам управляет сменой буферов. */
|
|
DISPLAY_MODE_SAFE = 0,
|
|
|
|
/* Ручной режим: приложению нужно управлять буферами самостоятельно. */
|
|
DISPLAY_MODE_RAW
|
|
|
|
} display_mode_t; /* Тип режима работы подсистемы дисплея. */
|
|
|
|
|
|
/* ============================================================
|
|
=== Конфигурация
|
|
============================================================ */
|
|
|
|
typedef struct
|
|
{
|
|
uint16_t width; /* Ширина кадра в пикселях. */
|
|
uint16_t height; /* Высота кадра в пикселях. */
|
|
|
|
/*
|
|
* 1 или 2.
|
|
* Должно быть <= DISPLAY_MAX_BUFFERS.
|
|
*/
|
|
uint8_t buffer_count; /* Количество используемых кадровых буферов. */
|
|
|
|
display_mode_t mode; /* Выбранный режим работы буферизации. */
|
|
|
|
} display_config_t; /* Параметры инициализации подсистемы дисплея. */
|
|
|
|
|
|
/* ============================================================
|
|
=== Жизненный цикл
|
|
============================================================ */
|
|
|
|
/* Инициализирует подсистему дисплея и выделяет нужные ресурсы. */
|
|
void display_init(const display_config_t* cfg);
|
|
|
|
|
|
/* ============================================================
|
|
=== Новый paint-контракт
|
|
============================================================ */
|
|
|
|
/* Неблокирующе начинает рисование кадра и возвращает буфер, либо NULL. */
|
|
uint16_t* display_begin_paint_try(void);
|
|
|
|
/* Блокирующе начинает рисование кадра и возвращает валидный буфер. */
|
|
uint16_t* display_begin_paint_blocking(void);
|
|
|
|
/* Завершает рисование кадра и запускает его отправку; false при ошибке контракта. */
|
|
bool display_end_paint(void);
|
|
|
|
|
|
/* Возвращает буфер, который в данный момент отправляется через DMA. */
|
|
uint16_t* display_get_scanout_buffer(void);
|
|
|
|
|
|
/* ============================================================
|
|
=== Управление буферами (только режим RAW)
|
|
============================================================ */
|
|
|
|
/* Меняет местами draw/scanout буферы; false при недопустимых условиях. */
|
|
bool display_swap_buffers(void);
|
|
|
|
|
|
/* ============================================================
|
|
=== Управление кадром
|
|
============================================================ */
|
|
|
|
/* Запускает DMA-передачу текущего scanout-буфера. */
|
|
/* Возвращает false, если DMA занят или сейчас открыта paint-секция. */
|
|
bool display_submit(void);
|
|
|
|
|
|
/* Возвращает true, когда DMA неактивен и можно отправлять следующий кадр. */
|
|
bool display_ready(void);
|
|
|
|
|
|
/* Блокирует выполнение до полного завершения текущей DMA-передачи. */
|
|
void display_wait(void);
|
|
|
|
|
|
/* ============================================================
|
|
=== Хук IRQ
|
|
============================================================ */
|
|
|
|
/* Вызывается из реального DMA IRQ-обработчика для уведомления движка. */
|
|
void display_dma_irq_handler(void);
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|