赞
踩
平台: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)++; 差异,前一个运行结果是指针指向下一个地址,后一个结果是指针指向的数值自加。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。