移植GT_HMI_Engine_arduino库思维导图如下所示(本文以ESP32S3开发板为例)
一、准备工作
开发环境:VSCode + PlatformIO
硬件:Arduino开发板,LCD显示屏,触摸屏/按键。
准备一份带有以下驱动的工程:
(1)显示屏驱动;
(2)触摸/按键驱动;
(3)定时器驱动;
(4)sdram/sram 驱动;
(5)如果需要使用到字库或者素材,则还需要实现对应的 spi 驱动以读取 flash。
下载GT_HMI_Engine_arduino库:
Gitee仓库:https://gitee.com/genitop/GT_HMI_Engine_arduino
GitHub仓库:https://github.com/gaotongfont/GT_HMI_Engine_arduino
二、开始移植
1.添加GT_HMI_Engine_arduino库到项目工程中
把下载好的GT_HMI_Engine_arduino放在工程目录下的lib文件夹下,如下图所示:
2.修改配置
在main.cpp中,把gt.h的头文件添加进来
将gui初始化函数gt_init();添加进来。
添加定时心跳函数
在开发板的定时器驱动中加入 1ms 的心跳函数 gt_tick_inc(1),保证 GUI 持续运行。
添加定时事务处理函数
在setup初始化中设置定时器 1ms 触发一次中断,并在loop循环中加入 gui 的事务处理函数
gt_task_handler();使其每 1ms 循环执行一次。
修改屏幕尺寸宏
在gt_conf.h中,修改对应屏幕宽度与高度宏,根据实际需要进行修改。
如果使用很多控件,可适当加大GT_MEM_SIZE的大小。
修改屏缓冲方式
这个时候编译一下,会出现以下这些错误
出现前面4个错误的原因是 gt_disp_port.c 中定义的刷屏数组太大,超过片内的ram空间,把它定义在片外的sram中即可,在这里我使用PSRAM分配内存,需要自己参考对应主控芯片的情况以及对sram的使用情况来决定。
首先在gt_port_disp.c中把头文件"esp_heap_caps.h"添加进来
然后使用PSRAM进行内存分配。还需要修改platformio.ini配置文件,在这里添加指定FLASH和PSRAM的运行模式以及启动PSRAM。
3.实现对接的驱动接口
再次编译,发现还存在以下这4个错误原因是还没有实现对应的刷屏,触摸,按键和 spi 读写驱动接口。
在 main.cpp 文件中分别实现这些接口函数:(注意函数名与各自外部声明的位置一致)
刷屏函数
_flush_cb 刷屏函数(声明在 gt_port_disp.c 中),该函数的功能是刷新绘制区域,示例如下:
事实上,当你没有触摸,不需要按键,资源较小不需要放在flash中读写时,以下这三个函数可以为空,不实现功能。在这里我不裁剪。
触摸函数
read_cb触摸函数(声明在gt_port_indev.c中),该函数的功能是获取触摸状态以及触摸处于被按下状态时触摸点的坐标,示例如下:
注:这里使用的2.4寸显示屏没有触摸,在这里先把注释掉,以防编译报错,需要实现的话,可以参考这个思路。
按键函数
read_cb_btn 按键函数(声明在 gt_port_indev.c 中),该函数与触摸函数类似,也需要获取物理按键按下与抬起状态。
在这里,使用按键来代替触摸屏,这时按键需要具备切换控件焦点与确定控件焦点的功能。首先,在gt_port_indev.c中把注册输入设备按键的类型改成GT_INDEV_TYPE_KEYPAD。
这里我使用三个按键,把KEY1的功能设置成切换下一个控件,KEY2的功能设置成切换上一个控件,KEY0的功能设置成确定控件焦点,相当触摸的点击作用,按下KEY0即可触发焦点所在控件的事件,实现界面的交互。
spi读写函数
spi_wr函数(声明在gt_port_vf.c中)
注:这里没使用字库或者素材,在这里同样注释掉,需要实现的话,可以参考这个思路。
编译一下,发现错误还在,
原因可能是在gt_port_disp.c,gt_port_indev.c, gt_port_vf.c文件中,这4个驱动接口没有被链接到。把这几个.c文件都改成.cpp文件,如下图所示:
再次编译,会提示成功未出现报错。
4.添加示例函数
打开GT_HMI_Engine_arduino库中extras/examples/widgets/gt_example_button.c,复制里面的代码放在main.app里,这里我增加多两个btn,然后在setup中调用gt_example_button();代码如图所示:
然后编译下载到开发板,以下是该例程效果展示: