lvgl图形化设计工具GUI Guider结合使用

前言

  1. 上篇博客整合了lvgl到项目中,采用的是自己编写源码的方式,实现了个简单的界面。
  2. 实际过程中一般情况开发界面都借助设计工具,这里使用的是gui guider来进行示例记录

项目结构(生成代码路径依然放到项目路径下)

在这里插入图片描述

CMakeLists配置(改为引用LVGL的源码)

file(GLOB_RECURSE EmWinSrcEmWin/Source/*.cEmWin/Resource/*.c
)file(GLOB_RECURSE LVGL_SRCLVGL/Code/*.c
)set(LVGL_INCLVGL/Code/customLVGL/Code/generatedLVGL/Code/generated/guider_fontsLVGL/Code/generated/guider_customer_fonts)target_sources(${PROJECT_NAME}.elfPRIVATE${LVGL_SRC})target_include_directories(${PROJECT_NAME}.elfPUBLIC${LVGL_INC}
)

LVGL任务线程调整

在这里插入图片描述

/** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date           Author       Notes* 2024-4-20     shchl   first version*/
#include "includes.h"
#include "lv_api_map.h"#if 1#define APP_TASK_GUI_LVGL_PRIO 15
#define APP_TASK_GUI_LVGL_STK_SIZE 4096/*
*******************************************************************************************************
*                               外部引入变量
*******************************************************************************************************
*//*
*******************************************************************************************************
*                               变量
*******************************************************************************************************
*/
TX_THREAD gui_lvgl_thread;
VOID *gui_thread_stack_area;
/*
*********************************************************************************************************
*                                       静态全局变量
*********************************************************************************************************
*//*
*********************************************************************************************************
*                                      函数声明
*********************************************************************************************************
*/
static VOID gui_lvgl_thread_entry(ULONG input);/*
*********************************************************************************************************
*                                      外部函数
*********************************************************************************************************
*/
/*** @brief cpu 状态任务* @param first_thread 第一个启动的任务线程首地址*/
int tx_task_gui_lvgl_create() {UINT status;gui_thread_stack_area = app_malloc(APP_TASK_GUI_LVGL_STK_SIZE);if(!gui_thread_stack_area){tx_printf("app malloc error\r\n");return -1;}status = tx_thread_create(&gui_lvgl_thread,              /* 任务控制块地址 */"gui lvgl thread",               /* 任务名 */gui_lvgl_thread_entry,                  /* 启动任务函数地址 */0,                             /* 传递给任务的参数 */gui_thread_stack_area,            /* 堆栈基地址 */APP_TASK_GUI_LVGL_STK_SIZE,    /* 堆栈空间大小 */APP_TASK_GUI_LVGL_PRIO,        /* 任务优先级*/APP_TASK_GUI_LVGL_PRIO,        /* 任务抢占阀值 */TX_NO_TIME_SLICE,               /* 不开启时间片 */TX_AUTO_START);                 /* 创建后立即启动 */if (status) {tx_printf("create error:%d\r\n",status);}return TX_SUCCESS;
}TX_THREAD_EXPORT(tx_task_gui_lvgl_create);/*
*********************************************************************************************************
*                                      内部函数
*********************************************************************************************************
*/
#include "gui_guider.h"
#include "events_init.h"
lv_ui guider_ui;static VOID gui_lvgl_thread_entry(ULONG input) {setup_ui(&guider_ui);events_init(&guider_ui);while (1) {lv_task_handler();tx_thread_sleep(5);}}#endif

测试界面

在这里插入图片描述

通过软件添加3个事件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码事件中添加日志

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

将移动代码的获取新值的回调函数替换成自己的(原有的基础上加个输出)

/** Copyright 2024 NXP* SPDX-License-Identifier: MIT* The auto-generated can only be used on NXP devices*/#include "events_init.h"
#include <stdio.h>
#include "lvgl.h"void events_init(lv_ui *ui) {
}int32_t lv_anim_path_ease_in2(const lv_anim_t *a);static void screen_1_btn_1_event_handler(lv_event_t *e) {lv_event_code_t code = lv_event_get_code(e);lv_anim_t screen_1_led_1_anim_x;lv_anim_t screen_1_led_1_anim_y;switch (code) {case LV_EVENT_CLICKED: {lv_obj_set_style_bg_color(guider_ui.screen_1_spangroup_1, lv_color_make(0xd2, 0x1e, 0x1e), LV_PART_MAIN);lv_obj_set_pos(guider_ui.screen_1_led_1, 0, 0);//Write animation: screen_1_led_1move in x directionlv_anim_init(&screen_1_led_1_anim_x);lv_anim_set_var(&screen_1_led_1_anim_x, guider_ui.screen_1_led_1);lv_anim_set_time(&screen_1_led_1_anim_x, 10000);lv_anim_set_exec_cb(&screen_1_led_1_anim_x, (lv_anim_exec_xcb_t) lv_obj_set_x);lv_anim_set_values(&screen_1_led_1_anim_x, lv_obj_get_x(guider_ui.screen_1_led_1), 0);lv_anim_set_path_cb(&screen_1_led_1_anim_x, &lv_anim_path_ease_in2);lv_anim_start(&screen_1_led_1_anim_x);//Write animation: screen_1_led_1move in y directionlv_anim_init(&screen_1_led_1_anim_y);lv_anim_set_var(&screen_1_led_1_anim_y, guider_ui.screen_1_led_1);lv_anim_set_time(&screen_1_led_1_anim_y, 10000);lv_anim_set_exec_cb(&screen_1_led_1_anim_y, (lv_anim_exec_xcb_t) lv_obj_set_y);lv_anim_set_values(&screen_1_led_1_anim_y, lv_obj_get_y(guider_ui.screen_1_led_1), 0);lv_anim_set_path_cb(&screen_1_led_1_anim_y, &lv_anim_path_ease_in2);lv_anim_start(&screen_1_led_1_anim_y);logInfo("screen_1_btn_1_event_handler");}break;default:break;}
}static void screen_1_btn_2_event_handler(lv_event_t *e) {lv_event_code_t code = lv_event_get_code(e);lv_anim_t screen_1_led_1_anim_x;lv_anim_t screen_1_led_1_anim_y;switch (code) {case LV_EVENT_CLICKED: {lv_obj_set_pos(guider_ui.screen_1_led_1, 0, 0);//Write animation: screen_1_led_1move in x directionlv_anim_init(&screen_1_led_1_anim_x);lv_anim_set_var(&screen_1_led_1_anim_x, guider_ui.screen_1_led_1);lv_anim_set_time(&screen_1_led_1_anim_x, 10000);lv_anim_set_exec_cb(&screen_1_led_1_anim_x, (lv_anim_exec_xcb_t) lv_obj_set_x);lv_anim_set_values(&screen_1_led_1_anim_x, lv_obj_get_x(guider_ui.screen_1_led_1), 320);lv_anim_set_path_cb(&screen_1_led_1_anim_x, &lv_anim_path_ease_in2);lv_anim_start(&screen_1_led_1_anim_x);//Write animation: screen_1_led_1move in y directionlv_anim_init(&screen_1_led_1_anim_y);lv_anim_set_var(&screen_1_led_1_anim_y, guider_ui.screen_1_led_1);lv_anim_set_time(&screen_1_led_1_anim_y, 10000);lv_anim_set_exec_cb(&screen_1_led_1_anim_y, (lv_anim_exec_xcb_t) lv_obj_set_y);lv_anim_set_values(&screen_1_led_1_anim_y, lv_obj_get_y(guider_ui.screen_1_led_1), 480);lv_anim_set_path_cb(&screen_1_led_1_anim_y, &lv_anim_path_ease_in2);lv_anim_start(&screen_1_led_1_anim_y);tx_printf("screen_1_btn_2_event_handler\r\n");}break;default:break;}
}// 自定义 lv_anim_path_ease_in
int32_t lv_anim_path_ease_in2(const lv_anim_t *a) {static int cnt = 0;if (cnt > 20) { // 刷新20次,打印一次,方便调试lv_coord_t x = lv_obj_get_x(guider_ui.screen_1_led_1);lv_coord_t y = lv_obj_get_y(guider_ui.screen_1_led_1);logInfo("(x,y)-->(%d,%d)", x, y);cnt = 0;} else {cnt += 1;}/*Calculate the current step*/uint32_t t = lv_map(a->act_time, 0, a->time, 0, LV_BEZIER_VAL_MAX);int32_t step = lv_bezier3(t, 0, 50, 100, LV_BEZIER_VAL_MAX);int32_t new_value;new_value = step * (a->end_value - a->start_value);new_value = new_value >> LV_BEZIER_VAL_SHIFT;new_value += a->start_value;return new_value;
}void events_init_screen_1(lv_ui *ui) {lv_obj_add_event_cb(ui->screen_1_btn_1, screen_1_btn_1_event_handler, LV_EVENT_ALL, NULL);lv_obj_add_event_cb(ui->screen_1_btn_2, screen_1_btn_2_event_handler, LV_EVENT_ALL, NULL);
}

在这里插入图片描述

总结

  1. gui guider 基本上不做太复杂的逻辑设计,够用了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验2 组合逻辑电路与时序逻辑电路设计

实验目的: 1.构建基于verilog语言的组合逻辑电路和时序逻辑电路; 2.掌握verilog语言的电路设计技巧。 3.完成如下功能:加法器、译码器、多路选择器、计数器、移位寄存器等。 实验内容及步骤: 一、实验原理 原理图文件《数字系统设计_sch.pdf》,找到如下两个部分: 图…

一文扫盲(5):实验室管理系统的界面设计

本次带来第5期&#xff1a;实验室管理系统的设计&#xff0c;从系统定义、功能模块、界面构成和设计着力点四个方面讲解&#xff0c;大千UI工场愿意持续和大家分享&#xff0c;欢迎关注、点赞、转发。 一、什么是实验室管理系统 实验室管理系统是一种用于管理和监控实验室运作…

nodejs版本过高导致vue-cli无法启动的解决方案

目录 前言异常现象解决方案总结 前言 之前使用软件管家升级了Nodejs&#xff0c;今天在运行Vue项目的时候老是报错&#xff0c;查了很多资料&#xff0c;最后确定是Nodejs版本过高导致的。 异常现象 E:\project\ry\RuoYi-Cloud\ruoyi-ui>npm run dev> ruoyi3.6.4 dev …

13-LINUX--消息队列

一.消息队列 1.消息队列&#xff1a;消息队列为一个进程向另一个进程发送一个数据块提供了条件&#xff0c;每个数据块会包含一个类型。 2.相关函数 1>.msgget(key_t key,int msgflg) : 创建消息队列 2>. msgsnd&#xff1a;把消息添加到消息队列 3>.msgrcv &#xf…

CSS布局 Flex 和 Grid

在 CSS 中&#xff0c;理解 flex 和 Grid 布局非常重要&#xff0c;今天把这两个重要知识点回顾一下。 Flexbox 弹性盒子布局 弹性布局支持 flex、inline-flex&#xff0c;支持块和内联。 容器 轴的概念&#xff0c;在 Flexbox&#xff0c;有主轴和侧轴的概念&#xff0c;轴…

实验 3--表的基本操作与数据查询

文章目录 实验 3--表的基本操作与数据查询4.3.1 实验目的4.3.2 实验准备实验内容1.在 SSMS 中向数据库 YGKQ 中的表插入数据。2.使用 T-SQL 语句向 YGKQ 中的表插入数据。3.在 SSMS 中删除数据库 YGKQ 中的表数据。4.使用 T-SQL 语句删除数据库 YGKQ中的表数据。5.在 SSMS 中修…

OPAM模型(细粒度图像分类)

OPAM模型&#xff08;细粒度图像分类&#xff09; 摘要Abstract1. OPAM1.1 文献摘要1.2 细粒度图像分类1.3 研究背景1.4 OPAM模型创新点1.5 OPAM模型1.5.1 补丁过滤1.5.2 显着性提取1.5.3 细粒度区域级注意模型对象-空间约束方法&#xff08;Object spatial constraint&#xf…

WSL安装-问题解决

WslRegisterDistribution failed with error: 0x8004032d WslRegisterDistribution failed with error: 0x80080005 Error: 0x80080005 ??????? 解决&#xff1a; 1、 winr输入&#xff1a;optionalfeatures.exe 2、打开这两项

javaWeb项目-网吧网咖管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JAVA简介 JavaSc…

Vitis HLS 学习笔记--优化指令-BIND_OP_STORAGE

目录 1. BIND_OP_STORAGE 概述 1.1 BIND_OP 1.2 BIND_STORAGE 2. 语法解析 2.1 BIND_OP 2.2 BIND_OP 用法示例 2.3 BIND_STORAGE 2.4 BIND_STORAGE 示例 3. 实例演示 4. 总结 1. BIND_OP_STORAGE 概述 BIND_OP_STORAGE 其实是两个优化指令的合称&#xff1a;BIND_OP…

easyx库的学习(文字绘制)

前言 昨天刚刚写完了基本图形的制作&#xff0c;今天直接可以来看看&#xff0c;在easyx中使用文字 直接看代码吧 文字绘制 void drawTest() {printf("hello,EasyX");//指的是在控制台打印//设置字体大小&#xff0c;样式settextstyle(30, 0, "微软雅黑&quo…

模块三——二分:704.二分查找

文章目录 前言二分查找算法简介特点学习中的侧重点算法原理模板 题目描述算法原理解法一&#xff1a;暴力解法解法二&#xff1a;二分查找算法算法流程细节问题循环结束的条件为什么是正确的&#xff1f;时间复杂度 代码实现 前言 本系列博客是逐渐深入的过程&#xff0c;建议…

BCLinux8U6系统部署oceanbase分布式数据库社区版之一、准备 OBD 中控机

本文记录了在BCLinux8U6操作系统的虚拟服务器准备oceanbase开源数据库的 OBD 中控机的过程。 一、中控机环境 1、虚拟服务器硬件配置 2、操作系统版本信息 [rootlocalhost ~]# cat /etc/os-release NAME"BigCloud Enterprise Linux" VERSION"8.6 (Core)&qu…

【链表】Leetcode 两数相加

题目讲解 2. 两数相加 算法讲解 我们这里设置一个头结点&#xff0c;然后遍历两个链表&#xff0c;使用一个flag记录相加的结果和进位&#xff0c;如果两个链表没有走到最后或者进位不等于0&#xff0c;我们就继续遍历处理进位&#xff1b;如果当前的链表都遍历完成了&#x…

移动Web学习08-响应式布局bootstrap的使用

2、响应式布局 2.1、什么响应式布局 响应式布局是一种网页设计的方法&#xff0c;能够使网站在不同的设备上&#xff08;如桌面电脑、平板电脑、手机等&#xff09;呈现出最佳的用户体验。其核心思想是使网页能够根据用户的设备和屏幕尺寸自动调整布局和内容&#xff0c;以适…

代码随想录算法训练营第五十九天 | 503. 下一个更大元素 II、42. 接雨水

代码随想录算法训练营第五十九天 | 503. 下一个更大元素 II、42. 接雨水 503. 下一个更大元素 II题目解法 42. 接雨水题目解法 感悟 503. 下一个更大元素 II 题目 解法 题解链接 使用两个size class Solution { public:vector<int> nextGreaterElements(vector<in…

【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制(CRC算法、MD5算法)

目录 UDP协议 UDP协议的报文结构及注意事项 UDP报文结构中的校验和字段 1. 校验和主要校验的内容 2. UDP校验和的实现方式 3. CRC&#xff08;循环冗余校验&#xff09;算法 4. MD5&#xff08;Message Digest Algorithm 5&#xff09; UDP协议 上一篇文章提过&#xf…

计算机网络实验——学习记录五(TCP协议2)

一、TCP协议重传机制 TCP协议是一种面向连接、可靠的传输层协议。为了保证数据的可靠传输&#xff0c;TCP采用数据包重传的机制来应对网络传输过程中可能出现的丢包、错包和乱序等问题。 TCP协议的重传包括超时重传、快速重传、带选择确认SACK的重传和重复SACK重传四种。 二、…

grafana安装篇(1)

目录 grafana概念&#xff1a; 它具有以下主要特点&#xff1a; Grafana 常用于以下场景&#xff1a; 环境介绍&#xff1a; 前置环境&#xff1a; (1)保证可以连接外网 (2)防火墙和selinux已关闭 1.下载安装grafana10.0.1-1rpm包 2.启动grafana 3.浏览器访问 3.设置…

实验2 NFS部署和配置

一、实训目的 1.了解NFS基本概念 2.实现NFS的配置和部署 二、实训准备 1.准备一台能够安装OpenStack的实验用计算机&#xff0c;建议使用VMware虚拟机。 2.该计算机应安装CentOS 7&#xff0c;建议采用CentOS 7.8版本。 3.准备两台虚拟机机&#xff08;客户机和服务器机&…