Files
zhouli 7b0ef5c551 feat(lua): add camera preview and RGB565 display support
- add borrowed-frame camera APIs and preview demo for Lua
  - rework display RGB565 pipeline around panel interface handling
  - add HSV pixel API and rainbow demo for led_strip
  - expose display panel interface constants from board_manager
  - add esp32_p4_function_ev board support files
2026-04-14 21:18:10 +08:00

149 lines
6.1 KiB
C

/*
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
/* Display Hardware Abstraction Layer
*
* Declares the interface that the board/application layer must implement.
* The lua_module_display component calls these functions to perform display
* operations without depending on any specific LCD driver.
*/
#include <stdbool.h>
#include <stdint.h>
#include "esp_err.h"
#include "esp_lcd_panel_io.h"
#include "esp_lcd_panel_ops.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef enum {
DISPLAY_HAL_TEXT_ALIGN_LEFT = 0,
DISPLAY_HAL_TEXT_ALIGN_CENTER,
DISPLAY_HAL_TEXT_ALIGN_RIGHT,
} display_hal_text_align_t;
typedef enum {
DISPLAY_HAL_TEXT_VALIGN_TOP = 0,
DISPLAY_HAL_TEXT_VALIGN_MIDDLE,
DISPLAY_HAL_TEXT_VALIGN_BOTTOM,
} display_hal_text_valign_t;
typedef struct {
uint8_t framebuffer_count;
bool double_buffered;
bool frame_active;
bool flush_in_flight;
} display_hal_animation_info_t;
typedef enum {
DISPLAY_HAL_PANEL_IF_IO = 0,
DISPLAY_HAL_PANEL_IF_RGB,
DISPLAY_HAL_PANEL_IF_MIPI_DSI,
} display_hal_panel_if_t;
/* --- Lifecycle --- */
esp_err_t display_hal_create(esp_lcd_panel_handle_t panel_handle,
esp_lcd_panel_io_handle_t io_handle,
display_hal_panel_if_t panel_if,
int lcd_width,
int lcd_height);
esp_err_t display_hal_destroy(void);
/* --- Geometry --- */
int display_hal_width(void);
int display_hal_height(void);
/* --- Frame control --- */
esp_err_t display_hal_begin_frame(bool clear, uint16_t color565);
esp_err_t display_hal_present(void);
esp_err_t display_hal_present_rect(int x, int y, int width, int height);
esp_err_t display_hal_end_frame(void);
bool display_hal_is_frame_active(void);
esp_err_t display_hal_get_animation_info(display_hal_animation_info_t *info);
/* --- Drawing primitives --- */
esp_err_t display_hal_clear(uint16_t color565);
esp_err_t display_hal_set_clip_rect(int x, int y, int width, int height);
esp_err_t display_hal_clear_clip_rect(void);
esp_err_t display_hal_fill_rect(int x, int y, int width, int height, uint16_t color565);
esp_err_t display_hal_draw_line(int x0, int y0, int x1, int y1, uint16_t color565);
esp_err_t display_hal_draw_rect(int x, int y, int width, int height, uint16_t color565);
esp_err_t display_hal_draw_pixel(int x, int y, uint16_t color565);
esp_err_t display_hal_set_backlight(bool on);
esp_err_t display_hal_fill_circle(int cx, int cy, int r, uint16_t color565);
esp_err_t display_hal_draw_circle(int cx, int cy, int r, uint16_t color565);
esp_err_t display_hal_draw_arc(int cx, int cy, int radius,
float start_deg, float end_deg, uint16_t color565);
esp_err_t display_hal_fill_arc(int cx, int cy, int inner_radius, int outer_radius,
float start_deg, float end_deg, uint16_t color565);
esp_err_t display_hal_draw_ellipse(int cx, int cy, int radius_x, int radius_y,
uint16_t color565);
esp_err_t display_hal_fill_ellipse(int cx, int cy, int radius_x, int radius_y,
uint16_t color565);
esp_err_t display_hal_draw_round_rect(int x, int y, int width, int height,
int radius, uint16_t color565);
esp_err_t display_hal_fill_round_rect(int x, int y, int width, int height,
int radius, uint16_t color565);
esp_err_t display_hal_draw_triangle(int x1, int y1, int x2, int y2,
int x3, int y3, uint16_t color565);
esp_err_t display_hal_fill_triangle(int x1, int y1, int x2, int y2,
int x3, int y3, uint16_t color565);
/* --- Text --- */
esp_err_t display_hal_measure_text(const char *text, uint8_t font_size,
uint16_t *out_width, uint16_t *out_height);
esp_err_t display_hal_draw_text(int x, int y, const char *text, uint8_t font_size,
uint16_t text_color565, bool has_bg, uint16_t bg_color565);
esp_err_t display_hal_draw_text_aligned(int x, int y, int width, int height,
const char *text, uint8_t font_size,
uint16_t text_color565, bool has_bg, uint16_t bg_color565,
display_hal_text_align_t align,
display_hal_text_valign_t valign);
/* --- Bitmap --- */
/* pixels: RGB565, MSB-first byte order */
esp_err_t display_hal_draw_bitmap(int x, int y, int w, int h, const uint16_t *pixels);
esp_err_t display_hal_draw_bitmap_crop(int x, int y,
int src_x, int src_y,
int w, int h,
int src_width, int src_height,
const uint16_t *pixels);
esp_err_t display_hal_draw_bitmap_scaled(int x, int y,
const uint16_t *pixels,
int src_width, int src_height,
int scale_w, int scale_h,
int *out_w, int *out_h);
/* --- JPEG --- */
esp_err_t display_hal_draw_jpeg(int x, int y,
const uint8_t *jpeg_data, size_t jpeg_len,
int *out_w, int *out_h);
esp_err_t display_hal_draw_jpeg_crop(int x, int y,
int src_x, int src_y,
int w, int h,
const uint8_t *jpeg_data, size_t jpeg_len,
int *out_w, int *out_h);
esp_err_t display_hal_jpeg_get_size(const uint8_t *jpeg_data, size_t jpeg_len,
int *out_w, int *out_h);
esp_err_t display_hal_draw_jpeg_scaled(int x, int y,
const uint8_t *jpeg_data, size_t jpeg_len,
int scale_w, int scale_h,
int *out_w, int *out_h);
#ifdef __cplusplus
}
#endif