# gecAuto **Repository Path**: rich-embed/gec-auto ## Basic Information - **Project Name**: gecAuto - **Description**: 类广告机,触屏解锁密码,图片滑动、轮播,视音频播放 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2021-10-21 - **Last Updated**: 2021-10-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ARM广告终端机 ### 1. 基本介绍 ​ 一款基于Linux-ARM开发的视频播放机,内置电子相册、音视频播放功能,主页附加了密码解锁功能,增加产品的可互动性。视频播放模块是基于MPlayer开源的多媒体播放器,使用命令行驱动,这里则采用FIFO管道文件与APP进行通信。电子相册则使用触屏驱动的方式滑动图片,其中引入独立线程绘图的方案提高滑动动画的流畅性,考虑到环境为公众场合则附加了自动轮播图片的功能。独立线程的方案就是多起线程,每个线程负责绘制各自负责的区域,但造成大量资源开销,仍需要不断优化。文件管理使用双向循环链表,自行开发链表检索、修改等接口。使用git管理迭代版本和推送远程仓库便于多人开发。 **使用到的技术:**多进程、多线程、文件IO、FIFO、链表、MPlayer、Git ### 2. 基本流程图 ```mermaid graph LR A[程序初始化] -->B(视频播放) B --> |循环播放,等待解锁| B B --> |解锁成功| C{主页面} C --> |返回,上锁| B C --> D(电子相册) C --> E(音乐) C --> F(视频) C --> |待开发| G(语音识别) ``` ### 2. 各模块说明 ##### 1) 程序初始化 > 1. 创建线程监听`触屏事件` > > * 触摸(即触摸时触发)、绝对位移(触摸后移动触发)、按钮(即按下松手时触发)、~~位移(即向量移动量触发)~~ > * 向其它功能模块提供全局变量和检索接口 > > 2. 更改工作目录 > > 防止从其它目录运行此软件造成资源访问失败 > > ```c > /******************************************************* > * @brief 改变工作目录 > * > * @param cmd_param 命令行的第一个参数,用来计算出工作路径 > ******************************************************/ > void change_work_dir(char *cmd_param) > { > char path[PATH_MAX] = {0}; > getcwd(path, PATH_MAX); //获取当前工作目录 > strcat(path, cmd_param); //将命令行路径追加到当前工作目录 > chdir(path); //变更目录 > printf("chdir done.\n"); > } > ``` > > > > 3. 读取json格式的config.json > > 引用GitHub的开源框架[DaveGamble/cJSON](https://github.com/DaveGamble/cJSON) > > ```json > { > "audio": "./music", > "video": "./video", > "image": "./picture/jpg", > "password": "5555" > } > ``` > > 4. 播放视频 > * 初始化FIFO文件 > * 独立进程给MPlayer,令其读取FIFO文件中的指令 ##### 2) 解锁 > * 阻塞并循环检索屏幕上方解锁区域,触发后进入解锁界面 > * 解锁密码回显`●`则采用`freetype`开源库 > * 更多细节详阅[`/src/unlock.c`](https://gitee.com/Time--Chicken/gec-auto/raw/master/src/unlock.c) ##### 3) 电子相册 > **实现模块详阅**[`/src/album.c`](https://gitee.com/Time--Chicken/gec-auto/raw/master/src/album.c) > > * 实现思路 > > ```flow > init=>start: 资源初始化 > load_resource=>operation: 加载图片到相对应的内存区域 > wait_touch=>operation: 等待触摸 > is_touch_flag=>condition: 是否持续触摸 > calc_offset=>subroutine: 计算偏移量,检测下拉项,创建两条线程分别绘制触摸点的左边和右边 > create_pthread_draw=>subroutine:创建两条线程分别绘制触摸点的左边和右边 > record_end_xy=>operation: 计算松手时坐标、总偏移量 > correct_offset=>operation: 矫正偏移量(4种情况) > > pull_down_menu=>inputoutput: 下拉菜单选择 > exit=>end: 结束框 > > init->load_resource->wait_touch->is_touch_flag > is_touch_flag(yes)->calc_offset->is_touch_flag > is_touch_flag(no)->record_end_xy->correct_offset > correct_offset->wait_touch > ``` > > ```flow > sd=>start: 电子相册 > pull_down_menu=>operation: 触发下拉菜单选项 > switch_mode=>condition: 选择自动(yes)和手动(no) > a=>operation: 3s自动轮播图片 > b=>operation: 需要手动拖动图片 > > sd->pull_down_menu->switch_mode > switch_mode(no)->b->pull_down_menu > switch_mode(yes)->a->pull_down_menu > > ``` ##### 4)音视频播放器 > 1. 初始化文件列表 > * 文件列表的管理采用双向循环链表 > * 从`config.json`中指定的文件夹读取该目录下的所有媒体文件 > * 文件的操作采用编号作为主键的方式,即根据编号来操作 > * 将文件操作的file_list模块独立出来,方便后续摸鱼使用 > 2. 使用命令行播放媒体文件 > * 默认根据file_list索引编号按顺序播放 > * 例如播放编号为1的文件,则先去file_list中查找,将结构体中的文件位置和文件名取出拼接,后命令行加载播放 ### 3. 总结 **优点:** 1. 部分页面跳转采用y=x^2的延时函数模型让切图没那么生硬 2. 能实现手动滑动图片时左右图片能跟着指尖移动 3. 采用独立文件存储配置,增加程序的灵活性 **待完善:** 1. 工期安排不妥,造成部分需求未能实现 2. 程序实现思路还不够清晰,没有完整代码流程图 3. 音视频播放做得很粗糙,切换媒体文件时概率出现文件查找失败 4. 仍大量未知的bug,比如时不时会出现段错误(虽然C第三方库能用try捕捉)