自制嵌入式GUI 【前1-3篇】-基于freeRTOS

2023-05-16

自制GUI第4篇:https://blog.csdn.net/shungry/article/details/78659613

自制GUI第5篇:https://blog.csdn.net/shungry/article/details/85246023

———————————————————————分割线—————————————————————————

本篇文章我在野火论坛中发布过,现在修改下发到这里(里面可能会有很多逻辑不通的地方请见谅)

第一篇

因为接近毕业,在老师的推荐下做了个GUI,花了将近一个月的时间,从一点都不了解C++,到用C++做出一个简单的消息机制,以及简单的控件库,发帖纪念一下。虽然还是简单的不行,包括各个控件的重绘机制都有些BUG 重绘的控件会重新改过所有的控件-----尴尬。想消息处理机制依然有些混乱,借鉴了miniGui的窗口过程方式,但是人家毕竟是pc上的大型GUI,理解不大来,期间也看了QT,最后才加了自己理解用孩子兄弟二叉树表示了整个GUI的结构,现在发现了许多因这种方式的不足,但是一条路走到黑了。
二叉树:
 
目前的GUI测试界面:
 
list控件:(实在是简陋)
键盘:(只支持英文)
 
对话框:
 

图中还有 单选框,复选框,滑块和进度条。---第一次发帖,确实不会排版,大牛们见谅哈。。
现在自己的脑子一片混乱,没发做下去了。我老师还想我增强可移植性。。。😢



补充一句:我现在还在完善代码,如果不出意外,本周末或下周会发最新的情况。
中间还有很多BUG,我也不知道自己能做成什么样。
有兴趣的各位可以加入一起完善代码。---------------------但是C++代码真的写的难看

第二篇


之前的GUI实现方法都没讲,以后慢慢讲把。但是代码都公开,虽然很难看。但是很欢迎大家提意见。
这里还是感谢火哥支持,让我有了做下去的动力!!!
之前留下了一些自己很难解决的问题,这次大概全部都解决了(但是有些都是走擦边球
上次发的问题 :
     问题 1:当某个控件注册重绘后再消失时,桌面还留下了之前的控件的图案,之前解决方法在控件销售时重绘桌面(这样当所有小按键消失时都会导致背景重绘,所以会出现屏幕经常闪动)
     解决 :在呼出要覆盖当前界面的控件时,先把要覆盖的数据保存到新建的buffer里面,再覆盖,当当前控件回收时再从buffer中把数据读回。如图:(字丑不要嫌弃)
     
     问题 2:当有呼出一些控件时(如键盘),在去按其他被键盘覆盖的控件时,又会把键盘覆盖。(这个不符合逻辑,按理说按键应该时最高层的,谁都无法覆盖它。)
                 问题的本身是所有的控件不知道谁把谁覆盖了,各个的显示层次是怎么样的。
     解决 :当创建,或呼出一个新的控件时,把自己进行采样成一个个点,会遍历控件树(上一篇稍微提过,我是用树来实现相应关系的)去一个个比对是否采样点在控件范围中,若是则把控件标记为被覆盖,设置覆盖其的对象是新的控件。这样当被覆盖的控件被点按时,上面的控件也会被刷新,保证一直被覆盖。如图:(这个会一点出现闪屏,但是是我目前不大改代码下最好的方法了。)
       
     问题 3:一些按钮会出现bug,导致GUI奔溃,卡带。(这个想想就害羞 0 0 ----不完整的就发出来了。)

     这个纯属自己没考虑好,现在已经解决。

注意: 左上角的‘ X ’是我测试用的 不要按得太频繁,会出现脏图像。
       

之后将要实现 1.布局类(可以方便的布局控件,不需要计算绝对坐标)
                    2.重写绘画函数(现在都是使用火哥的函数,为了方便GUI其他板子方便移植)
                    3.完成可移植性
我用Cpp写的所以堆的要求较大,因为是树结构我中间用了递归,所以栈的要求也不小。

第三篇

最近去投简历了,就没有太多的进展(添加了布局类),这次我就大概记录自己做这个GUI的思路吧。
1.
在第一篇的时候我简单的讲过我这个是基于 孩子兄弟二叉树 的映像表达。
如图:(二叉树中,左边的为孩子,右边的为兄弟)
 
有什么好处呢?当时觉得比较容易管理,而且思路清晰。
如图:这样一个根节点会有两个孩子窗口(WinA,WinB),然后窗口中又有孩子控件(a,b1,b2),WinA和WinB是兄弟关系,b1和b2也是兄弟关系,查找起来就很方便。
 
因为我选择的是二叉树,所以当要重绘全部的时候,只要用树的先序遍历就能把所有的窗口控件全部都画出来。如果我想要注销某一个窗口或控件,通过把他们从树中分离,其他连带的孩子也会背分离,同样的添加也很方便。
如图:(便于遍历,删除,添加,这是我的主要目的)
 
上面讲的是GUI的结构存储情况。
下面的GUI控件中的消息机制,我有点参考MiniGUI(其实也没怎么研究MiniGUI >_< 大神们莫见怪)

2.
TGUI的所有控件的交互都是基于消息机制的。
怎么说呢,就是每一个线程会维护一个消息队列。(我这里用的是freeRTOS 线程自带的队列--原理一样)
然后每个控件/窗口都会有 窗口过程函数 (这需要我们自己实现),用来实现触发该控件/窗口时应该做的处理过程。
如图:描述了一个 创建控件/窗口 注册 重绘 循环接收信息处理 的全过程。(当然也可以自己动态创建,这个是后话了 其实原理差不多)
 

3.
这一次我多添加了布局类(以后添加控件,布局控件比较方便吧)参考于Java的布局类。我主要实现了 
流式布局(flowLayout):一个一个控件按顺序排列,一行排列不下就换行接着排列,到时只需用addWin函数添加控件就好
 
边框布局(borderLayout):把指定的区域分成东、西、南、北、中五个区域存放控件
 
网格布局(gridLayout):这个顾名思义就把窗口划分为大小一样的网格,用控件进行排列(都继承一个layout基类,用的方法都差不多。)
 

还有可移植性还是没想好,画图的函数还没做。主要就是画图函数和后面的LCD驱动各有不同,还在想中。
最后还是贴上我的资源:
GitHub:https://github.com/909452726/TGUI
百度网盘:http://pan.baidu.com/s/1pLyZH0n
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自制嵌入式GUI 【前1-3篇】-基于freeRTOS 的相关文章

  • FreeRTOS_中断

    传送门 博客汇总帖 传送门 Cortex M3 中断 异常 传送门 Cortex M3笔记 基础 笔记内容参考 正点原子的FreeRTOS开发手册 cortex m3权威指南 Cortex M3和Cortex M4权威指南等 文中stm32
  • tkinter控件样式

    文章目录 以按钮为例 共有参数 动态属性 tkinter系列 GUI初步 布局 绑定变量 绑定事件 消息框 文件对话框 控件样式 扫雷小游戏 强行表白神器 以按钮为例 tkinter对控件的诸多属性提供了可定制的功能 下面以最常用的按钮作为
  • 【GUI】LVGL8内存泄漏分析

    LVGL版本 V8 0 2 平台 ESP32S3 在调试过程中 发现有两个界面 在重复退出再进入时内存会不断增加的吃内存现象 然后做了分析和研究 1 样式style吃内存 在主页面 进入simple页面 再退出到主页面 再次进入simple
  • Qt Creator 5.9.9下载与安装图解详细教程

    Qt Creator 5 9 9下载与安装图解详细教程 一 Qt Creator 下载 推荐最新版5 9 9 网上可能推荐4 x x 但实际上不是做专业UI项目的话Qt Creator版本越新越好 其一 安装包给你集合到一个 exe里面 不
  • QT 信号发送多个参数

    你可以把多个参数包装为一个类发送 实测是可以的
  • 基于HAL库的FREERTOS-----------三.队列

    一 队列简介 在实际的应用中 常常会遇到一个任务或者中断服务需要和另外一个任务进行 沟通交流 这个 沟通交流 的过程其实就是消息传递的过程 在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式 但是如果在使用操作系统的应用中用
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • 【Qt教程】1.9 - Qt5菜单栏、工具栏、状态栏、核心窗口、浮动窗口、QMainWindow

    1 窗口应用布局样式及组成 PC端软件 最基本的一个窗口应用布局样式 如下 大体可分为菜单栏 工具栏 状态栏 核心窗口 浮动窗口 使用时按需相互组合 2 Qt中调用这些控件 1 新建一个工程 使用QMainWindow类 2 例程源码 具体
  • FreeRTOS之软件定时器

    FreeRTOS之软件定时器 声明 本人按照正点原子的FreeRTOS例程进行学习的 欢迎各位大佬指责和批评 谢谢 include sys h include delay h include usart h include led h in
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • FreeRTOS笔记(十)中断

    中断 当CPU在执行某一事件A时 发生另外一个更重要紧急的事件B请求CPU去处理 产生了中断 于是CPU暂时中断当前正在执行的事件A任务而对对事件B进行处理 CPU处理完事件B后再返回之前中断的位置继续执行原来的事件A 这一过程统称为中断
  • 单片机通信数据延迟问题排查

    1 问题说明 笔者在最近的项目中 发现系统的响应延迟较高 经过排查 排除了单片机运行卡死的问题 2 原因分析 具体排查过程这里就不细致说明了 直接给出排查后原因 任务执行周期规划不合理 导致freertos队列发送接收到的命令有延迟 为了便
  • 在 esp32 上运行 lvgl + freetype

    前言 最近有个需求 如何在 esp32 上运行 lvgl freetype 这个想法的难点是 freetype 的环境搭建 我想将其做得非常简单 最好的办法是做成组件来使用 所以我将 freetype 的相关依赖做成了 esp idf 组件
  • Java Swing基础(层次结构,组件,布局管理)

    Swing基础层次结构 图形环境和图形对象 坐标 GUI组件的左上角坐标默认为 0 0 从左上角到右下角 水平坐标x和垂直坐标y增加 坐标的单位是像素 Graphics对象 专门管理图形环境 Graphics类是一个抽象类 抽象类Graph
  • Java GUI编程——在线聊天室

    引言 综合应用Java的GUI编程和网络编程 实现一个能够支持多组用户同时使用的聊天室软件 该聊天室具有比较友好的GUI界面 并使用C S模式 支持多个用户同时使用 用户可以自己选择加入或者创建房间 和房间内的其他用户互发信息 文字和图片
  • Python中Tkinter 图形化界面设计(详细教程)

    Python Tkinter 图形化界面设计 详细教程 一 图形化界面设计的基本理解 二 窗体控件布局 2 1 根窗体呈现示例 2 2 tkinter 常用控件 2 2 1常用控件 2 2 2 控件的共同属性 2 3 控件布局 2 3 1
  • 使用 PyQt 处理 SQL 数据库:基础知识

    目录 Connecting PyQt to an SQL Database 创建数据库连接 处理多个连接 使用不同的 SQL Divers 打开数据库连接 Running SQL Queries With PyQt 执行静态 SQL 查询
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 使用 Tkinter 进行 Python GUI 编程

    目录 Building Your First Python GUI Application With Tkinter 添加小部件 检查你的理解情况 Working With Widgets 使用标签小部件显示文本和图像 使用按钮小部件显示可
  • 当一个任务写入变量而其他任务读取该变量时,我们是否需要信号量?

    我正在研究 freeRtos 并且我有一个名为 x 的变量 现在 每秒只有一个任务正在写入该变量 而其他任务正在读取该变量值 我需要用互斥锁来保护变量吗 如果变量为 32 位或更小 并且其值是独立的并且不与任何其他变量一起解释 则不需要互斥

随机推荐

  • 自动类型转换

    xff08 一 xff09 自动类型转换 在java 程序中 xff0c 不同的基本类型的值经常需要进行相互类型转换 xff0c 类型转换分为自动类型转换和强制类型转换 布尔类型boolean占有一个字节 xff0c 由于其本身所代码的特殊
  • Eclipse中设置Tomcat服务器

    01首先打开eclipse软件 xff0c 点击顶部的windows菜单 xff0c 选择下拉菜单中的preferences选项 xff0c 如下图所示 02在弹出的Preference界面中选择Server 找到左侧的Runtime En
  • games系列学习 -- Möller Trumbore 算法

    M ller Trumbore 算法 是三角形与射线 光线 之间判定是否相交的快速算法 利用了重心坐标来表示三角形 首先假设射线的方程 xff1a O为发射点 D为方向向量 再假设三角形平面方程 xff1a b1 b2 1 b1 b2 分别
  • 使用手机摄像头实现视频监控实时播放

    使用手机摄像头实现视频监控实时播放 一 概述 视频监控实时播放的原理与目前较为流行的直播是一致的 xff0c 所以采用直播的架构实现视频监控实时播放 xff0c 流程图如下 xff1a
  • 滑模观测器

    什么是滑模观测器 1 滑模观测器是一类动态系统 2 滑模观测器是指根据系统的外部变量 输入变量和输出变量 的实测值得出状态变量估计值的一类动态系统 xff0c 也称为状态重构器 3 作用 xff1a xff08 1 xff09 滑模观测器不
  • ROS入门_1.18 接下来做什么?

    此时你应该已经对ROS中的一些核心概念有了一定的理解 给你一台运行ROS的机器人 xff0c 你应该能够运用所学知识来列出机器人上发布和订阅的各种话题 xff08 topic xff09 xff0c 查看话题中发布的消息 xff0c 然后编
  • 【git】看懂git diff

    git diff 可以用来比较 xff1a 1 staging area和working area的文件 xff08 无其他参数时 xff09 plain view plain copy print git diff 2 master分支和
  • makefile 自动编译同一个目录下的所有文件

    SOURCE 61 wildcard c OBJS 61 patsubst c o SOURCE CROSS COMPILE 61 arm linux CXX 61 gcc CFLAGS 43 61 static CLFAGS 43 61
  • PX4_Bootloader单步调试配置(STM32F7 配置)

    Bootloader Makefile 编译选项 Os g 43 O0 43 ggdb3 Bootloader libopencm3 lib stm32 f7 Makefile TGT CFLAGS 61 Os g 43 TGT CFLAG
  • 2021北邮自考c++实践题及答案

    北邮c 43 43 实践考期 xff0c 只能在每年的下半年进行报名 xff0c 11月进行考试 由于疫情原因 xff0c 现在均为线上考试 xff0c 每人的考题不同 xff0c 但是大同小异 xff0c 此为2021年的c 43 43
  • 从idea推送代码到github,到jenkins部署,再到从github下载代码完成构建的全部详细操作流程

    目录 1 idea推送代码到github 1 1 github创建 1 2 git下载与安装 xff08 windows xff09 1 3 idea关联github 1 3 1 windows生成公私钥 1 3 2 idea关联githu
  • Jmeter常用场景梳理

    一 在一段时间内持续发送请求 此场景可以用于稳定性测试 xff0c 在稳定性测试中 xff0c 通常需要持续压测几个小时甚至几天时间 xff0c 查看接口是否有报错 xff0c 或者cpu 内存会上涨 xff0c 此时就需要通过控制持续时间
  • vnc viewer连不上,vnc viewer连不上是什么原因?解决方法

    vnc viewer连不上是什么原因 接下来尝试在CentOS上安装一个VNC Server CentOS5 已经自带了VNC xff0c 默认也已经安装了 xff0c 只要配置一下就可以了 如果没有安装 xff0c 可以 yum inst
  • 基于netty框架的JTT808/JTT905/JTT1078协议客户端

    基于netty框架的JTT808 JTT905 JTT1078协议客户端 JTT808客户端网络处理 span class token keyword private span span class token keyword void s
  • The BMJ研究:现有的新冠病毒诊断AI模型,几乎毫无用处

    图片出处 xff1a unsplash 本文作者 xff1a 朱演瑞 新型冠状病毒对全球健康造成了严重的威胁 xff0c 为了减轻医疗保健系统的负担 xff0c 也给患者提供最佳的护理 xff0c 高效的诊断和疾病预后信息问题亟待解决 理论
  • 自动驾驶多传感器融合

    12月28日 xff0c 百度Apollo平台携手国内激光雷达公司禾赛科技扔下一颗名为Pandora的重磅炸弹 xff0c 此举将极大地加快无人驾驶落地的进程 xff0c 却也会让不少自动驾驶初创公司陷入无比尴尬的境地 简单地说 xff0c
  • YMFC-32 小四轴 (一)

    https github com jamesshao8 ymfc mini drone 本博客前几天送出了几个v1 0版本的ymfc小四轴 在这里我要说一下组装教程和使用方法 原材料采购 除了我的板子以外还需要一些零件 1 间距0 254的
  • HackRF 代码讲解 (一)

    本文包括驱动 固件 CPLD代码讲解 xff08 也包括gr osmosdr中的相关部分 xff09 HackRF是比较早期的一款SDR设备 xff0c 凭借其相对低廉的价格加上半双工收发能力 xff0c 在国内的SDR市场中占比很高 这款
  • STM32 GPS悬停飞控 (十)气压计

    上次的飞机有干扰问题 没法解决 可能因为我的元器件有问题 或者走线问题 本来打算按老外的一模一样做一个的 但现在想直接做带GPS的了 因为除GPS 罗盘 气压 数传外基本和上次那个一样的 这些部分即使装上也可以禁用 只剩摇控不一样了 暂时忽
  • 自制嵌入式GUI 【前1-3篇】-基于freeRTOS

    自制GUI第4篇 xff1a https blog csdn net shungry article details 78659613 自制GUI第5篇 xff1a https blog csdn net shungry article d