第三阶段应用层——1.13 数码相册—梳理与总结
数码相册—总结与归纳
- 硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)
- 软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统
- 参考资料:《嵌入式Linux应用开发手册》、《嵌入式Linux应用开发手册第2版》
- 开发环境:Linux 3.4.2内核、arm-linux-gcc 4.3.2工具链
- 源码仓库:https://gitee.com/d_1254436976/Embedded-Linux-Phase-3
目录
一、框架梳理
1、软件框架
对于上述完成主要功能的7个部分:encoding编码部分、fonts获取字体点阵部分、display显示部分、input输入部分、debug调试部分、page页面管理部分、render渲染部分、file文件映射部分
-
encoding编码部分:去文件中获得编码信息,对于每个文件,保存的时候,系统对自动或手动的根据编码规范,对文件的信息进行编码:如保存为
ASCII、GBK、UTF-8、UTF16LE、UTF16BE
; - fonts获取字体点阵部分:根据获得的编码信息得到字体数据(LCD上表示为点阵);
- display显示部分:把字体数据(点阵)显示在LCD上;
- input输入部分:管理不同的输入方式,定制不同的输入方式所实现的控制,满足多种控制场合;
- debug调试部分:设置打印等级和打印通道,通过打印等级来控制程序打印的调试信息、错误信息、警告信息等,通过打印通道设置来控制程序打印的输出的流向是标准输出还是网络打印输出。
- page页面管理部分:负责对多种页面进行管理,通过触控进行不同页面的切换与功能实现;
- render渲染部分:负责对bmp、jpg文件进行读取、解析、提取有效的像素信息、显示到LCD上;
- file文件映射部分:负责对图片文件进行信息读取并进行内存映射,供render渲染部分来获取信息。
2、Makefile框架
二、功能说明
1、支持文件浏览
对开发板的根文件系统的进行文件扫描、读取其文件信息,并通过页面规划显示。
效果图:
2、支持图片的操作
- 支持
bmp、jpg
格式的图片显示、缩放、移动; - 支持图片查看模式
- 支持指定目录、设置时间间隔进行图片连播模式
三、各页面效果图
- main_page主页面
- auto_page连播模式页面
- browse_page文件浏览模式页面
- manual_page图片查看模式页面
- setting_page设置页面
- interval_page设置时间间隔页面
四、使用到的技术
这里总结的是部分所使用到的技术,还有一些比较细致的技术就不作介绍。
1、显存管理
具体可以看【1.10 数码相册—main_page主界面的显存管理、页面规划、输入控制】
对于页面的显示,LCD与Framebuffer之间通过LCD控制器来进行像素信息的传递,当我们需要显示图片时,只需要在Framebuffer
中写入颜色信息就可以在LCD上显示出来。
当应用程序过大,会导致显示的很慢,此时需要优化措施:
- 在内存中开辟一个与
Framebuffer
大小相同的内存空间; - 提前把需要显示的内容写到新开辟的内存空间中;
- 需要显示时,直接把新开辟的内存空间
memcpy
到Framebuffer
中。
2、多线程管理
具体可以看【1.7 数码相册—电子书(5)—多线程支持多输入】和【1.7 数码相册—电子书(6)—支持远程打印信息】
主线程:负责初始化各种设备,创建子线程,等待子线程的输入信息,处于休眠。
- stdin输入子线程:负责响应stdin输入设备的输入事件的子线程,当发生输入事件时,主线程处于休眠状态,执行此线程的任务,执行完毕后则重新唤醒主线程。
- touchscreen输入子线程:负责响应touchscreen输入设备的输入事件的子线程,当发生输入事件时,主线程处于休眠状态,执行此线程的任务,执行完毕后则重新唤醒主线程。
在这里采用的是UDP协议,让这个文件作为服务器端程序,即在开发板上运行的程序为服务器端,供局域网中的客户端连接进来。对于传输数据的存储,考虑到一开始没有客户端连接,所以设置了一个环形缓冲区来进行存储数据。
同时在这个文件中设置了两个子线程,发送线程与接收线程:
- 发送线程:用来发送打印信息给客户端。
- 接收线程:用来接收控制信息,如修改打印级别、修改打印通道。
3、网络编程
具体可以看【1.7 数码相册—电子书(6)—支持远程打印信息】
实现多线程支持多输出:标准输出与UDP网络打印输出。
在这里采用的是UDP协议,让这个文件作为服务器端程序,即在开发板上运行的程序为服务器端,供局域网中的客户端连接进来。对于传输数据的存储,考虑到一开始没有客户端连接,所以设置了一个环形缓冲区来进行存储数据。同时在这个文件中设置了两个子线程,发送线程与接收线程:
- 发送线程:用来发送打印信息给客户端。
- 接收线程:用来接收控制信息,如修改打印级别、修改打印通道。
4、libjpeg-turbo库
具体可以看【1.8 数码相册—在LCD上显示JPG图片】
使用一些libjpeg-turbo库
来对JPEG文件进行处理,解压出我们所需要的原始RGB数据。
5、FreeType库
具体可以看【1.4 数码相册—FreeType介绍】、【1.5 数码相册—使用FreeType在LCD上显示单个字符】和【1.6 数码相册—使用FreeType在LCD上显示多行文字】
使用FreeType字体引擎,产生高质量的输出(字形图像)。