#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_x:X轴的范围 * 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设置为100,range_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