ESM8000主板图形界面编程简介

 2021-11-2 16:06:36     作者:黄志超    

1、概述


  英创公司推出的ESM8000主板搭载了NXP i.MX8M Mini Quad 64位异构处理器,包含了一颗主频1.6GHz的四核ARM Cortex-A53和一颗主频400MHz 的ARM Cortex-M4,同时还搭配了GPU(图形处理单元)和VPU(视频处理单元),对于嵌入式应用来说性能已经非常强劲了。ESM8000主板上预装的系统为Linux-5.4.47,为了支持图形用户界面,使用了Wayland作为主板的窗口系统,并移植了基于Wayland的Qt,让用户可以通过Qt来开发图形界面。


  Wayland可以看作是X11窗口系统的优化升级版本,按照目前的趋势会逐渐替代X11成为Linux系统最主流的窗口系统。他们之间最明显的区别是Wayland使用Wayland Compositor替代了X11中的X Server和Compositor,将这两部分合二为一,从而省去了很多不必要的繁琐步骤,提高了整个窗口系统的效率,可以参考下面的示意图:


ESM8000主板图形界面编程简介.png

X11结构示意图     Wayland结构示意图


  Wayland还是采用的服务器-客户端模式,同时提供了一套完整的协议定义图形用户界面和输入设备管理。其中Wayland Compositor既要负责绘制窗口,同时也作为Server端,我们在ESM8000主板中已经移植了Wayland官方推荐的Weston(轻量级Wayland Compositor)。Weston会同时启动一些Client,它们会负责系统全局的界面,比如窗口管理,绘制界面等操作。通过Client能够方便的绘制、移动、管理图形窗口,获取鼠标键盘等输入事件。在实际开发的过程中,可以选择通过Client自己绘制,或是在Client上通过更高层的如Qt,GTK+这些widget库等进行绘制。当绘制完后Client会通知Weston执行渲染操作,而ESM8000内部有一个GPU图形处理模块(支持OpenGL ES 2.0),Weston会自动调用内部的GPU对图形渲染进行加速,这样能够有效的降低CPU负载。对于Wayland这里就不做过多的介绍了,感兴趣的客户可以参考:https://wayland.freedesktop.org/查看详细的资料。


  ESM8000主板上移植了Qt 5.15.0,根据上面的描述可以了解到,Qt能够作为Wayland的Client端进行绘制。所以我们推荐用户在开发中直接使用Qt进行应用程序的开发,这样开发应用程序更加快捷而且能够容易的获得统一的显示效果。同时得益于Weston对ESM8000主板GPU的支持,在主板上运行的Qt程序也能够通过GPU对图形渲染进行加速。在ESM8000主板上支持标准的Qt C++编程以及QML脚本编程,用户可以按照习惯选择熟悉的方式来进行开发。下面我们就以一个使用C++编程的简单界面来演示ESM8000主板上Qt程序的显示效果。


2、Qt应用程序开发简介


  首先我们通过QtCreator创建一个Qt Widgets Application,根据实际情况选择路径以及构建套件(Kit),这里选择ESM8000的版本,如下图所示:


ESM8000主板图形界面编程简介.png


ESM8000主板图形界面编程简介.png


  工程生成以后,会自动生成Widget类以及必要的C++代码,我们可以在ui文件中,选择拖入一些控件来查看效果,示例中主要加入了按钮(pushButton)、下拉菜单(comoBox)以及显示文字的标签(label):


ESM8000主板图形界面编程简介.png


  在主板上运行效果如下:


ESM8000主板图形界面编程简介.png


  界面中最上面的工具栏是Weston自带的weston-desktop-shell显示的,用于负责界面全局窗口的管理(本质上还是一个Wayland Client)。如果不需要显示这个工具栏,在/etc/xdg/weston/weston.ini文件中增加对shell的配置,就可以去掉这个工具栏,如下图:


ESM8000主板图形界面编程简介.png


  保存该文件后重启Weston就可以了:

  #> systemctl restart weston@root


  重新设置后,显示效果如下:


ESM8000主板图形界面编程简介.png


  如果需要窗口全屏,并且不想留下Widget的窗口控制栏,可以对Widget进行全屏设置,代码如下:


MainWindow w;  
w.showFullScreen();  
w.show();


  显示效果如下:


ESM8000主板图形界面编程简介.png


  关于Qt的编程,在Qt的官网上也有详细的说明和文档,感兴趣的客户可以参考https://doc.qt.io/qt-5/qtexamplesandtutorials.html


3、总结


  从本文的介绍中,可以看到通过传统的Qt C++的方式进行编程,对于嵌入式应用来说已经可以满足大部分常规的界面设计需求,Qt常用的控件都能够直接支持(如示例中按钮、下拉菜单等)。


  但是目前应用中比较多使用到的视频监控等内容,由于要涉及到解码等操作因此需要使用VPU(视频处理单元),而Qt中提供的C++类qtmultimedia因为无法调用VPU,会自动采用软件解码,这样会导致效率很低并且占用大量CPU资源。所以这时需要使用到QML或者在C++代码中调用gstreamer来进行处理,这部分操作我们会在后续的文章中详细说明。