mcu_ab568x/app/platform/libs/api_gui.h
2025-05-30 18:03:10 +08:00

733 lines
22 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef _API_GUI_H
#define _API_GUI_H
typedef struct rect_t_ {
s16 x;
s16 y;
s16 wid;
s16 hei;
} rect_t;
typedef struct point_t_ {
s16 x;
s16 y;
} point_t;
typedef struct area_t_ {
s16 wid;
s16 hei;
} area_t;
typedef void widget_t;
typedef void widget_page_t;
typedef void widget_image_t; //功能比较全
typedef void widget_icon_t; //只有简单的贴图和缩放功能但是更省Buffer
typedef void widget_text_t;
typedef void widget_rect_t;
typedef void widget_qrcode_t;
typedef void widget_arc_t;
typedef void widget_chart_t;
typedef void widget_circle_t;
//=== 常用颜色非常用颜色可以用make_color函数来生成 ===
#define COLOR_WHITE 0xFFFF
#define COLOR_BLACK 0
#define COLOR_RED 0xF800
#define COLOR_GREEN 0x07E0
#define COLOR_BLUE 0x001F
#define COLOR_YELLOW 0xFFE0
#define COLOR_MAGENTA 0xF81F
#define COLOR_CYAN 0x07FF
#define COLOR_GRAY 0x8410
#define COLOR_DARKGRAY 0xAD55
#define COLOR_DIMGRAY 0x6B4D
//=== GUI ===
//GUI初始化参数
typedef struct gui_init_param_t_ {
u16 screen_width; //屏幕宽
u16 screen_height; //屏幕高
u8 *element_buf; //element与widget缓存
u8 *widget_buf;
u16 element_buf_size;
u16 widget_buf_size;
u8 *temp_buf; //中间计算缓存
u32 temp_buf_size; //中间计算缓存大小
u8 *lines_buf; //推屏缓存(双份)
u32 lines_buf_size; //推屏缓存大小
u16 lines_count; //每次推屏的行数
u16 maxsize_parbuf; //PAR解码缓存
u32 font_res_addr; //字库资源地址
u16 max_font_size;
u8 font_wspace; //字的间距
u8 font_hspace;
u8 rsvd[20];
} gui_init_param_t;
void os_gui_init(const gui_init_param_t *param); //GUI初始化
void os_gui_draw(void); //TE信号起来后GUI开始绘制图形
void gui_process(void); //主循环调用更新Widget绘制
void gui_set_te_margin(u8 margin); //设置TE时隙
void gui_widget_refresh(void); //刷新widget
void os_gui_draw_w4_done(void); //等待当前帧刷完
area_t gui_image_get_size(u32 res_addr); //获取图像尺寸
area_t widget_image_get_size(widget_image_t *img); //根据控件获取图像尺寸
typedef enum WGT_CHART_TYPE_ {
CHART_TYPE_BAR, //直角柱形
CHART_TYPE_BAR_ARC, //圆角柱形
}WGT_CHART_TYPE;
/**
* @brief 生成一个RGB565的颜色值
* @param[in] r : #ff0000 红色饱和度(0 ~ 0xff)
* @param[in] g : #00ff00 绿色饱和度(0 ~ 0xff)
* @param[in] b : #0000ff 蓝色饱和度(0 ~ 0xff)
* @return RGB565的颜色值
**/
u16 make_color(u8 r, u8 g, u8 b);
//============= Widget Common ==============//
/**
* @brief 创建控件池(最多允许创建两个)并创建首个widget_page
* @param[in] flag_top : 是否在顶层
* @return page
**/
widget_page_t *widget_pool_create(bool flag_top);
/**
* @brief 清除一个控件池
* @param[in] widget : 首个widget_page
* @return 无
**/
void widget_pool_clear(widget_page_t *widget);
/**
* @brief 获取第一个Widget配合widget_get_next来遍历所有Widget
* @param[in] 无
* @return 无
**/
void *widget_get_head(void);
/**
* @brief 根据当前widget获取下一个widget
* @param[in] widget:当前的widget
* @return next widget
**/
widget_t *widget_get_next(const widget_t *widget);
/**
* @brief 获取Widget的父Page
* @param[in] widget:当前的widget
* @return 当前widget的widget_page
**/
widget_page_t *widget_get_parent(const widget_t *widget);
/**
* @brief 设置Widget的Alpha值
* @param[in] widget:需要设置的控件
* @param[in] alpha:透明度(0 ~ 0xff)
* @return 当前widget的widget_page
**/
void widget_set_alpha(widget_t *widget, u8 alpha);
/**
* @brief 获取Widget的Alpha值
* @param[in] widget:控件指针
* @return alpha:透明度(0 ~ 0xff)
**/
u8 widget_get_alpha(widget_t *widget);
/**
* @brief 设置Widget是否按中心点来设置坐标
* @param[in] widget:需要设置的控件
* @param[in] align_center:true:按中心对齐,false按左上角对齐default:true
* @return 无
**/
void widget_set_align_center(widget_t *widget, bool align_center);
/**
* @brief 设置Widget是否按中心点来设置坐标
* @param[in] widget:需要设置的控件
* @param[in] align_center:true:按中心对齐,false按左上角对齐default:true
* @return 无
**/
bool widget_get_align_center(widget_t *widget);
/**
* @brief 设置Widget坐标
* @param[in] widget:需要设置的控件
* @param[in] x:以屏幕左上角为原点控件的中心点或左上角的x坐标
* @param[in] y:以屏幕左上角为原点控件的中心点或左上角的y坐标
* @return 无
**/
void widget_set_pos(widget_t *widget, s16 x, s16 y);
/**
* @brief 设置Widget大小
* @param[in] widget:需要设置的控件
* @param[in] width:宽度
* @param[in] height:高度
* @return 无
**/
void widget_set_size(widget_t *widget, s16 width, s16 height);
/**
* @brief 设置Widget坐标及大小
* @param[in] widget:需要设置的控件
* @param[in] x:以屏幕左上角为原点控件的中心点或左上角的x坐标
* @param[in] y:以屏幕左上角为原点控件的中心点或左上角的y坐标
* @param[in] width:宽度
* @param[in] height:高度
* @return 无
**/
void widget_set_location(widget_t *widget, s16 x, s16 y, s16 width, s16 height);
/**
* @brief 获取Widget坐标及大小
* @param[in] widget:控件指针
* @return 控件的位置和大小
**/
rect_t widget_get_location(const widget_t *widget);
/**
* @brief 获取Widget绝对坐标及大小
* @param[in] widget:需要设置的控件
* @return 控件的绝对位置和大小
**/
rect_t widget_get_absolute(const widget_t *widget);
/**
* @brief 设置Widget的显示状态
* @param[in] widget:需要设置的控件
* @param[in] visible:true:可见 false:隐藏
* @return 无
**/
void widget_set_visible(widget_t *widget, bool visible);
/**
* @brief 获取widget显示状态
* @param[in] widget:控件指针
* @return 显示状态 true:可见 false:隐藏
**/
bool widget_get_visble(widget_t *widget);
//============= Widget Page ==============//
/**
* @brief 创建一个Page型widget
* @param[in] parent:父控件
* @return page widget
**/
widget_page_t *widget_page_create(widget_page_t *parent);
/**
* @brief 判断widget是否为一个Page型
* @param[in] widget:需要判断的控件
* @return true or false
**/
bool widget_is_page(const void *widget);
/**
* @brief 设置Page client相对Page Window左上的坐标。0,0则对齐到左上角
* @param[in] widget:需要设置的控件
* @param[in] x:相对于左上角x坐标
* @param[in] y:相对于左上角y坐标
* @return 无
**/
void widget_page_set_client(widget_page_t *widget, s16 x, s16 y);
/**
* @brief 设置Page window缩放到的大小。0,0则不进行缩放
* @param[in] wid:缩放的宽度
* @param[in] hei:缩放的高度
* @return 无
**/
void widget_page_scale_to(widget_page_t *widget, s16 wid, s16 hei);
/**
* @brief 更新Page信息
* @param[in] 无
* @return 无
**/
void widget_page_update(void);
//============= Widget Image ==============//
enum {
ROT_MODE_NORMAL, //普通旋转模式
ROT_MODE_X, //只旋转X (平行四边形, 2.5D效果)
};
/**
* @brief 创建图片widget,支持缩放、裁剪和旋转
* @param[in] parent:父控件
* @param[in] res_addr:图片地址在ui.h中获取
* @return widget_image_t
**/
widget_image_t *widget_image_create(widget_page_t *parent, u32 res_addr);
/**
* @brief 设置图片
* @param[in] img:图片控件
* @param[in] res_addr:图片地址在ui.h中获取
* @return 无
**/
void widget_image_set(widget_image_t *img, u32 res_addr);
/**
* @brief 设置图片的旋转角度,图片旋转时,需要经过转换工具勾上 旋转压缩 的选项
* @param[in] img_ptr:图片控件
* @param[in] angle:旋转角度 0 ~ 3600
* @return 无
**/
void widget_image_set_rotation(void *img_ptr, s16 angle);
/**
* @brief 按坐标设置图像旋转角度,图片旋转时,需要经过转换工具勾上 旋转压缩 的选项
* @param[in] img:图片控件
* @param[in] x:相对于x
* @param[in] y:相对于y
* @return 无
**/
void widget_image_set_rotation_bypos(widget_image_t *img, s16 x, s16 y);
/**
* @brief 设置图片的旋转中心点
* @param[in] img_ptr:图片控件
* @param[in] x:相对于x
* @param[in] y:相对于y
* @return 无
**/
void widget_image_set_rotation_center(void *img_ptr, s16 x, s16 y);
/**
* @brief 设置图像旋转模式
* @param[in] img:图片控件
* @param[in] mode:ROT_MODE_NORMAL:普通旋转模式, ROT_MODE_X只旋转X (平行四边形, 2.5D效果)
* @return 无
**/
void widget_image_set_rotation_mode(widget_image_t *img, u8 mode);
/**
* @brief 裁剪图片区域
* @param[in] img:图片控件
* @param[in] x:相对于图片左上角x坐标
* @param[in] y:相对于图片左上角y坐标
* @param[in] wid:截取宽度
* @param[in] hei:截取高度
* @return 无
**/
void widget_image_cut(widget_image_t *img, s16 x, s16 y, s16 wid, s16 hei);
//设置图像前景色
AT(.text.widget)
void widget_image_set_color(widget_image_t *img, u16 color);
//============= Widget Icon ==============//
/**
* @brief 创建图标控件(和wiget_image的区别只有简单的贴图和缩放功能但是更省Buffer)
* @param[in] parent:父控件
* @param[in] res_addr:图片地址在ui.h中获取
* @return 图标控件
**/
widget_icon_t *widget_icon_create(widget_page_t *parent, u32 res_addr);
/**
* @brief 判断是否是一个图标控件
* @param[in] icon:任意widget
* @return true or false
**/
bool widget_is_icon(widget_icon_t *icon);
/**
* @brief 设置图标的图片
* @param[in] icon:图标控件
* @param[in] res_addr:图片地址在ui.h中获取
* @return 无
**/
void widget_icon_set(widget_icon_t *icon, u32 res_addr);
//============= Widget Text ==============//
/**
* @brief 创建一个文本控件.
* @param[in] parent:父控件
* @param[in] max_word_cnt:最多多少个字(不分全半角)
* @return 文本控件
**/
widget_text_t *widget_text_create(widget_page_t *parent, u16 max_word_cnt);
/**
* @brief 设置文本字库, 同时清空文本内容(需要重新设置文本内容)
* @param[in] txt:文本控件
* @param[in] font_res_addr:字库地址, 0则表示用回系统字体
* @return 无
**/
void widget_text_set_font(widget_text_t *txt, u32 font_res_addr);
/**
* @brief 清空文本内容.
* @param[in] txt:文本控件
* @return 无
**/
void widget_text_clear(widget_text_t *txt);
/**
* @brief 设置文本内容.
* @param[in] txt:文本控件
* @param[in] text:字符串文本内容
* @return 无
**/
void widget_text_set(widget_text_t *txt, const char *text);
/**
* @brief 设置文本颜色.
* @param[in] txt:文本控件
* @param[in] color:rgb565颜色值
* @return 无
**/
void widget_text_set_color(widget_text_t *txt, u16 color);
/**
* @brief 设置是否支持自适应大小
* @param[in] txt:文本控件
* @param[in] autosize:true or false
* @return 无
**/
void widget_text_set_autosize(widget_text_t *txt, bool autosize);
/**
* @brief 设置文本是否自动换行。
* @param[in] txt:文本控件
* @param[in] wordwrap:true or false
* @return 无
**/
void widget_text_set_wordwrap(widget_text_t *txt, bool wordwrap);
/**
* @brief 设置Client相对左上的坐标。0,0则对齐到左上角(用于文字滚动)
* @param[in] txt:文本控件
* @param[in] rel_x:以文本布局方向为参考系内容相对于控件左上角x坐标
* @param[in] rel_y:以文本布局方向为参考系内容相对于控件左上角y坐标
* @return 无
**/
void widget_text_set_client(widget_text_t *txt, s16 rel_x, s16 rel_y);
/**
* @brief 以文本布局方向为参考系,获取字体区域
* @param[in] txt:文本控件
* @return 文本内容的宽度和高度
**/
area_t widget_text_get_area(widget_text_t *txt);
/**
* @brief 以文本布局方向为参考系,获取文本框区域
* @param[in] txt:文本控件
* @return 文本框的宽度和高度
**/
area_t widget_text_get_box_area_rel(widget_text_t *txt);
/**
* @brief 获取文字行数
* @param[in] txt:文本控件
* @return :行数
**/
u8 widget_text_get_line_cnt(widget_text_t *txt);
/**
* @brief 获取文字行数
* @param[in] txt:文本控件
* @return :像素点数
**/
u16 widget_text_get_autoroll_circ_pixel(widget_text_t *txt);
/**
* @brief 获取系统字高(典型值,非最大值)
* @param[in] 无
* @return 系统字库字体字高
**/
u8 widget_text_get_height(void);
/**
* @brief 设置排版方向
* @param[in] right_align:排版方向是否右对齐
* @return 无
**/
void widget_text_set_right_align(widget_text_t *txt, bool right_align);
/**
* @brief 设置滚动模式
* @param[in] txt : 文本指针
* @param[in] mode : 滚动模式0:不滚动, 1:环形滚动 2、左右、普通滚动
**/
void widget_text_set_autoroll_mode(widget_text_t *txt, u8 autoroll_mode);
/**
* @brief 设置环形滚动间隔
* @param[in] txt : 文本指针
* @param[in] space_pixel : 环形滚动间隔以英文空格为单位默认是50
**/
void widget_text_set_autoroll_circ_space(widget_text_t *txt, u16 space_pixel);
/**
* @brief 获取排版方向
* @param[in] 无
* @return 排版方向1:右对齐 0:左对齐
**/
bool widget_text_get_right_align(widget_text_t *txt);
/**
* @brief 获取布局方向
* @param[in] 无
* @return 布局方向0:横向布局 1:竖向布局
**/
int widget_text_get_layout(widget_text_t *txt);
//============= Widget Rect ==============//
/**
* @brief 创建一个矩形控件
* @param[in] parent父控件
* @return 矩形控件
**/
widget_rect_t *widget_rect_create(widget_page_t *parent);
/**
* @brief 设置矩形的填充颜色
* @param[in] rect:矩形控件
* @param[in] color:填充颜色
* @return 无
**/
void widget_rect_set_color(widget_rect_t *rect, u16 color);
/**
* @brief 设置矩形的圆角半径
* @param[in] rect:矩形控件
* @param[in] r:圆角半径
当半大于高或宽的一半时,底层自动把半径设置为其中最小的;(高或宽的一半)
* @return 无
**/
void widget_rect_set_radius(widget_rect_t *rect, u16 r);
//============= Widget QRCode ==============//
enum {
QRCODE_TYPE_2D, //二维码
QRCODE_TYPE_HORIZONTAL, //横向条形码
QRCODE_TYPE_VERTICAL, //竖向条形码
};
/**
* @brief 创建Widget QRCode
* @param[in] parent父控件
* @param[in] qr_type类型
* @param[in] max_ch_cnt:需要支持的最大字符数
* @return 矩形控件
**/
widget_qrcode_t *widget_qrcode_create(widget_page_t *parent, u8 qr_type, u16 max_ch_cnt);
/**
* @brief 设置QRCode
* @param[in] qrcode码控件
* @param[in] str内容信息
* @return 无
**/
void widget_qrcode_set(widget_qrcode_t *qrcode, const char *str);
/**
* @brief 设置单位宽度, 同时会自动计算更新QRCode的大小
* @param[in] qrcode码控件
* @param[in] bit_wid像素宽度
* @return 无
**/
void widget_qrcode_set_bitwid(widget_qrcode_t *qrcode, u8 bit_wid);
/**
* @brief 设置显示宽度, 同时会自动计算更新QRCode的大小
* @param[in] qrcode码控件
* @param[in] qr_wid码宽度
* @return 无
**/
void widget_qrcode_set_bitwid_by_qrwid(widget_qrcode_t *qrcode, u16 qr_wid);
/**
* @brief 设置显示宽度, 同时会自动计算更新QRCode的大小
* @param[in] qrcode码控件
* @param[in] level码纠错等级
* @return 无
**/
void widget_qrcode_set_level(widget_qrcode_t *qrcode, u8 level);
/**
* widget交换前后位置(体现在显示上下层关系)
* widget_b : widget_t类型的处理完后会返回新地址
* widget_f : widget_t类型的处理完后会返回新地址
* 返回1成功0失败
page类型的widget不能参与交换会返回失败;
两个widget必须是相同的爸爸(parent),否则返回失败;
当两个不一样类型的widget需要交换这两个必须是相邻的否则返回失败;
*/
bool widget_bf_exchange(widget_t **widget_b, widget_t **widget_f);
//============= Widget ARC ==============//
/**
* 创建圆弧类型的widget
* parent:父亲
注意: widget_set_size 或 widget_set_location设置宽度来设置圆弧的大小所以没有在单独创建其他函数
*/
widget_arc_t *widget_arc_create(widget_page_t *parent);
/**
* 设置圆弧角度
* arc:arc widgeit
* start_angle:起始角度单位是0.1度(参考位置在右水平线上可以任意角度软件自动3600对齐如下图)
* end_angle :结束角度单位是0.1度(参考位置在右水平线上可以任意角度软件自动3600对齐如下图)
起始和结束角度没有限制谁大谁小
/|\ 270.0 度
|
|
|
|
180.0度 |
-------------------|----------------> 0 度
|
|
|
|
|
| 90.0 度
*/
void widget_arc_set_angles(widget_arc_t *arc, u16 start_angle, u16 end_angle);
/**
* 设置圆弧颜色
* arc:arc widgeit
* color_intra:设置角度内的颜色
* color_outre:设置角度外的颜色
比如设置的是30度到90度30到90度圆弧内颜色是color_intra其他圆弧是color_outre
*/
void widget_arc_set_color(widget_arc_t *arc, u16 color_intra, u16 color_outre);
/**
* 设置圆弧透明度
* arc:arc widgeit
* alpha_intra:设置角度内的透明度
* alpha_outre:设置角度外的透明度
比如设置的是30度到90度30到90度圆弧内透明度是alpha_intra其他圆弧是alpha_outre
*/
void widget_arc_set_alpha(widget_arc_t *arc, u8 alpha_intra, u8 alpha_outre);
/**
* 设置圆弧透宽度
* arc:arc widgeit
* arc_width:圆弧宽度(设置两个圆中间的那段圆弧宽度R1-R2)
不是半径哦,是内外半径差这个东东
*/
void widget_arc_set_width(widget_arc_t *arc, u16 arc_width);
/**
* 设置圆弧截面是否圆弧化
* arc:arc widgeit
* start_onoff: 开始角度位置 1:圆弧化 0:直线化
end_onoff : 结束角度位置 1:圆弧化 0:直线化
圆弧化后目前缩放对齐有点偏差
*/
void widget_arc_set_edge_circle(widget_arc_t *arc, bool start_onoff, bool end_onoff);
/**
* 创建实心圆类型的widget
* parent:父亲
注意: widget_set_size 或 widget_set_location设置宽度来设置圆的大小所以没有在单独创建其他函数
*/
widget_circle_t *widget_circle_create(widget_page_t *parent);
/**
* 设置实心圆颜色
* circle:circle widgeit
* color_intra:颜色
* alpha_intra:透明度
比如设置的是30度到90度30到90度圆弧内颜色是color_intra其他圆弧是color_outre
*/
void widget_circle_set_acolor(widget_circle_t *circle, u16 color_intra, u8 alpha_intra);
//============= Widget chart ==============//
/**
* 创建图表类型的widget
* parent:父亲
* type:选择图表类型,直角还是圆角
* max_num:需要最大的柱形数量
max_num设置一个最大值实际使用数量用后面widget_chart_set_real_num函数来设置
*/
widget_chart_t *widget_chart_create(widget_page_t *parent, WGT_CHART_TYPE type, u8 max_num);
/**
* 设置图表的等效范围
* chart:图表
* range_xX轴的范围
* range_y: Y轴的范围
图表的高和宽是widget_set_size 或 widget_set_location设置
range_x和range_y是设置多少等份举例widget_set_size设置的宽度是200像素range_x设置100表示将200分成100等份
这样做的原因是参考LVGL方便客户代码通用性
*/
void widget_chart_set_range(widget_chart_t *chart, u16 range_x, u16 range_y);
/**
* 设置图表的等效范围
* chart:图表
* real_num:设置实际使用的图表柱状个数,出现这个函数的原因是方便客户设置需要显示的数量;
需要小于create时候设置的max_num
*/
bool widget_chart_set_real_num(widget_chart_t *chart, u8 real_num);
/**
* 设置图表数据
* chart:图表
* id : 柱形图序列号0开始0 到 real_num-1(包含real_num-1)
x_start: 0到range_x范围
x_end : 0到range_x范围
y_start: 0到range_y范围
y_end : 0到range_y范围
color : RGB565
说明x_start和x_end及y_start和y_end意思设置这个柱状图x和y显示区域
举个例子range_x设置为100range_y设置为100调用如下函数后
widget_chart_set_value(chart, 0, 10, 20, 0, 100, COLOR_RED);
widget_chart_set_value(chart, 1, 30, 40, 50, 100, COLOR_RED);
大致如下显示
/|\ y轴正方向
| ** **
| ** **
| ** **
| ** **
| ** **
| **
| **
| **
0| **
----------------------------------------------> x正方向
*/
bool widget_chart_set_value(widget_chart_t *chart, u8 id, u16 x_start, u16 x_end, u16 y_start, u16 y_end, u16 color);
#endif // _API_GUI_H