linux-数码相框

news/2025/3/15 3:52:08/

平台:s3c2440 内核版本:linux-2.6.22.6

源码位置:https://github.com/yogach/digital_photo

描述:本数字相框实现共实现了主页面、文件浏览页面、图片模式浏览页面、图片联播页面、设置页面、联播模式时间间隔设置页面。图片部分支持BMP(自解析)、JPG(JPEG库)格式的图片。所有页面支持触摸屏(tslib库)控制。支持LCD页面显示。支持标准输出(stdout)与网络打印(socket)调试信息。

 

页面切换框图:

 

页面逻辑框图:

 

数据显示到lcd:同电子书的lcd显示刷新

 

 

页面内的图标显示:首先我们需要确定每个图标的显示位置,包括起始xy坐标结束xy坐标,然后获取图片原始数据,根据图标显示区域的长宽对原始图片进行缩放近邻取样差值算法),然后根据显示区域的起始地址,将图片数据写入到显存中,然后刷新到LCD显存,即可完成显示。

 

缩放算法 :近邻取样差值算法https://blog.csdn.net/xjp_xujiping/article/details/79044944

 

触摸屏控制:输入事件的获取使用多线程方式,子线程进入输入事件的阻塞读取,读取到之后唤醒主线程。在每次获取到触摸屏原始数据后,将按下位置的XY坐标与每个图标区域的起始结束XY坐标进行比较,如果每次按下松开(去除按下后滑动的情况)都是处于同一个图标区域内,则判断按下了此图标。

 

页面的平滑切换:为了使页面之间的切换更加平滑,使用多块显存空间,用于不同页面的显示。在程序开始阶段,会分配若干块显存,每次显示页面之前会根据页面的名字(char转化成int后相加)取出对应内存,如果此块内存的状态已是REDAY,则可以直接写入到lcd显存中,可以减少重新生成图片数据的时间,使页面之间的切换更加平滑。

 

文件夹内容信息的获得:使用scandir函数进行获取,

int scandir(const char *dir,struct dirent **namelist ,int (*filter)(const void *b),
      int ( * compare )( const struct dirent **, const struct dirent ** ) );

 

函数scandir扫描dir目录下(不包括子目录)满足filter过滤模式的文件,返回的结果是使用compare函数经过排序的,并保存在 namelist中。注意namelist是通过malloc动态分配内存的,所以在使用时要注意释放内存。alphasort和versionsort 是使用到的两种排序的函数。   
当函数成功执行时返回找到匹配模式文件的个数,如果失败将返回-1。namelist内容是dir(dir需要如下这种格式//mnt/才能获取成功)目录下的所有文件夹文件,包括".",".."。可使用stat()获取文件信息后,使用S_ISREG()S_ISDIR()函数判断是文件夹还是文件。

 

连播页面图片显示:使用多线程方式,子线程负责准备图片(预先加载图片数据到指定显存中)、休眠指定间隔时间、显示图片(将准备好的显存数据刷到lcd显存中,如果图片数据未准备好则重新准备),主线程负责接收触摸屏输入事件,在接收到触摸屏事件后,设置互斥量后等待子线程退出。

 

连播页面文件获取:使用深度优先的方式遍历设置的文件夹,最高支持10级递归调用,每次获取10个文件名,然后对获取的文件(绝对路径)进行分析,是否为可支持的显示文件,如果不行就找到一个能显示的为止。

 

 

点击图标按键效果:当按下图标时,将LCD显存中图标区域内的每个字节数据进行取反处理,代表已经按下了该按键。

 

 

浏览页面的文件夹显示:首先使用scandir()获取文件夹内容(第5点),读取到的内容根据文件类型,填充不同的图标,文件夹名字按ASCII码方式进行解析,得到Unicode码后使用freetype库得到位图后显示。每次进行翻页时,获取文件夹在namelist中(第5点)的计数,然后进行显示。

 

 

文件指针mmap: 使用fopen()打开文件以可读/可写方式打开文件(fopen与open的区别),使用fstat获取文件大小后,使用mmap方式映射到内存中。

 

BMP文件的解析:

https://www.cnblogs.com/Matrix_Yao/archive/2009/12/02/1615295.html

JPG文件的解析:

https://blog.csdn.net/xipiaoyouzi/article/details/53257720

 

 

设置间隔页面长按累加:使用tslib库得到的触摸屏原始数据内,会有按下或松开的时间值。在首次接收到按下操作时,记录下此时的触摸屏原始数据,将之后按下的时间值与初次记录的值做比较,符合一定时长判断为长按。(如果触摸屏驱动处理长按的方式为使用定时器重复上报输入事件)

 

打印信息封装:电子书项目相同

 

遇到的问题:

使用Scandir()获取文件夹内容,dir需要如下这种格式//mnt/才能获取成功。不然就返回获取到的为0。很奇怪

 

*piCurFileNumber++;与 (*piCurFileNumber)++; 差异,前一个运行结果是指针指向下一个地址,后一个结果是指针指向的数值自加。


http://www.ppmy.cn/news/588355.html

相关文章

数码相框(四、使用freetype库实现矢量字体显示)

注:本人已购买韦东山第三期项目视频,内容来源《数码相框项目视频》、数码相框-通过freetype库实现矢量显示,只用于学习记录,如有侵权,请联系删除。 在数码相框(三、LCD显示文字)中使用字体的点阵数据显示文字&#xff…

数码相框(三、LCD显示文字)

注:本人已购买韦东山第三期项目视频,内容来源《数码相框项目视频》,只用于学习记录,如有侵权,请联系删除。 文字在LCD上的显示其实就是LCD上的一些点的显示与不显示,这些显示的点就像我们的笔画一样&#x…

特权的DIY数码相框总结

本文是对DIY数码相框一章的总结,重在对整个数据通路的理解。 具体的需求参见该书的相关章节。整个数据流是: sd卡控制模块,通过spi接口读sd卡中的数据,给wrfifo进行缓存,满了256byte后wrfifo通知sdram读取fifo中的数…

11、数码相框编写程序之MainPage显存管理与页面规划

文章目录 1、显存的分配和获取1.1、构造显存链表的结构体1.2、显存分配函数1、将我们自己分配的显存加入显存链表2、 将LCD 实际设备FB 显存加入链表 1.3、显存获取函数 2、显示页面图标函数框架构思3、编写MainPage页面3.1、获得显存3.2、描画数据1、判断或得到的显存是否已经…

18.数码相框总结

框架 整体框架如上,我对他们的阅读顺序是按照博客发布的顺序来的,感觉还行,读起来不是特别困难 page文件夹下的代码太多,就不一个一个拿出来粘代码了,关于page文件夹的阅读顺序 **page_manager -> main_page ->…

数码相框笔记

1. 程序框架 1.1 触摸屏: 主按线程,通过socket发给显示进程 --------------------------- 封装事件:ts线程 按键线程 --------------------------- 操作系统 封装的数据有: 时间 类型(点击、上下左右移动) 位置 速度 幅度 1.2 显示…

数码相框项目学习笔记(一)

之前看了韦东山老师的数码相框项目,断断续续学完了,现在再整理回顾,做个笔记记录一下。 项目需求: 实现在开发板上显示、浏览图片文件,并能进行图片的放大、缩小、移动、连播等操作 项目的主体框架: 项目…

数码相框(一、系统框架)

注:本人已购买韦东山第三期项目视频,内容来源《数码相框项目视频》,只用于学习记录,如有侵权,请联系删除。 1.项目流程 ① 弄清需求 (弄清产品需要实现的功能); ② 设计框架 (怎么实现需求); ③…