嵌入式Linux系统的电子书阅读器项目1——Overview

2019-07-13 00:49发布

摘要:本项目是参考@韦东山的视频教程第三期嵌入式Linux jz2440平台的电子书项目框架,使用S5PV210 SOC芯片,Smart210开发板,基于Linux kernel 3.0.8做的移植与改进,算是一个学习嵌入式C语言框架化编程的练手项目。 项目源代码的github的repository链接如下:git@github.com:zczjx/dgt_pht.git , 网页版为:电子书项目-git仓库,电子书项目在dgt_book branch。clone 这个项目的爱好者,需要 git checkout  -b dgt_book origin/dgt_book对应的branch上。 1.电子书阅读器实现效果与功能 1).主要功能 在LCD触屏屏上显示txt文档的内的文字内容,并通过触屏的滑动效果或键盘在控制台终端的U和N键进行翻页,终端Q键退出。 2).效果展示
图1 电子书显示效果
图2 电子书滑动翻页效果

图3 控制台按键翻页效果 2.电子书阅读器系统架构 1).主要功能 软件系统的结构框图如图4所示。 图4 系统软件架构 2).架构概述 输入:  Txt  digital book 为原始的电子书文档,目前支持ascii、gbk、utf8、utf16-le、utf16-be等5种编码格式的文档。 输出: output display bitmap 用于lcd显示屏framebuffer 可以直接显示的位图数据。 电子书阅读器引擎(Book engine): 用于处理核心业务逻辑与各子模块之间的数据通信与交互。 编码系统(Encode system): 用于识别ascii、gbk、utf8、utf16-le、utf16-be等各种编码格式的txt文档,并将原始编码数据格 供给Book engine 处理的子系统。 字体系统(Font system): 通过Book engine 传输过来的格式化编码数据,查询并获取每个字符(char)对于的freetype矢量字体bitmap或者ascii与hzk字模bitmap,并拷贝font bitmap的副本给Book engine 输入事件系统(input event system): 获取电容触屏或终端输入的数据,并将数据包装成input event提交给Book engine处理。 显示系统(Display system): Book engine生成用于显示的最终output display bitmap提交给系统的framebuffer,刷新显示电子书的页面。 3.电子书阅读器引擎设计(book_engine) 1).book_engine 的 API 设计 book_engine 的API声明位于 include/book_engine.h 其核心电子书描述符结构声明如下: typedef struct book_dsc{ char *book_path_name; char **input_dev_ls; /*stdin / tscreen*/ struct book_buf bk_buf_attr; struct text text_attr; struct disp disp_attr; struct page_dsc *fisrt_pg_h; struct page_dsc *curr_pg; int (*show_next_pg)(struct book_dsc *self); int (*show_pre_pg) (struct book_dsc *self); struct input_ev rt_ev; int (*get_rt_input_ev)(struct input_ev *pev); }book_dsc; 大部分成员的含义如变量名所述,这里仅介绍几个稍显隐晦的变量。 input_dev_ls:
    使能系统支持的用户输入设备列表,该列表中的设备名,将在系统初始化之后激活打开。目前能够支持的输入设备名有:标准终端输入设备(stdin_dev)、电容触摸屏设备(tscreen) bk_buf_attr:     用于管理电子书txt文档的文件描述符,以及该电子书文件在内存mmap之后的起始结束地址与页面地址。页面地址变量的含义如图5所示。
 图5 电子书txt文档file fd在内存中的mmap 地址映射 text_attr:
    文字字体属性,用于管理和设置矢量字体类型、尺寸大小与编码格式的属性。因为并非每种编码格式能够被所有的font支持,因而初始化设置系统font库类型之后,系统判断电子书txt文件的编码格式是否被该字体支持。若不支持,则返回错误,若支持,则设置字体大小,并与系统字库bitmap文件的路径采用mmap方法相关联,以方便通过编码查询字体的bitmap。 disp_attr:
显示属性,用于管理和设置显示设备(FB or VGA)设备,以及背景和字体颜 {MOD}相关的值。 fisrt_pg_h 与 curr_pg:
页面缓存链表与当前页面,所有已经生成显示过的页面将会放在fisrt_pg_h 这个链表中,以加速来回翻页。 rt_ev:
实时的用户输入事件,通过get_rt_input_ev() 函数来刷新获取。 主要的API功能与用途概述如下:  init_book_load_sys(): 如同函数名,该API将加载激活各子系统,初始化用户提供的struct book_dsc *pdsc 描述符,将其即将显示的系统中的电子书文件book_path关联起来。 set_book_disp_attr(): 设置电子书的显示属性,显示设备与字体,背景颜 {MOD} devname:显示设备名字,目前只能选择LCD 的 "fb", 未来将支持 “svga” set_book_text_attr(): 设置电子书的字体属性与大小 font_name:"freetype"为矢量字体库,"ascii" 纯ascii英文字模,"hzk"为gbk编码的中文字库。 2).book_engine 的实现框架 book_engine 的中的api使用方法可以参考main.c中的sample code。 show_next_pg() 与 show_pre_pg主要实现电子书翻页的功能。 show_one_pg(): 合成并显示一个完整的页面,主要的调用过程, 获取页面格式化编码——>strip 掉空格和换行,重定位页面的文字显示光标位置——.>获取一个矢量字体,根据字体的显示属性,再次重定位显示光标点的位置——>将当前矢量字体显示到屏幕上,并更新下一个字体的光标位置 show_one_font(): 显示一个矢量字体,根据bitmap与color,调用显示设备的disp_pixel()函数将像素点一个个描绘出来。  update_global_pg_list(): 每生成显示一个新页面,便通过该函数更新fisrt_pg_h ,将该页面挂载到缓存链表,方便来回翻页。 relocate_font_dis_pos() 根据屏幕x,y轴分辨率大小,以及每个字体的尺寸,及时定位新的显示光标,决定是否换行或页满翻到下一页。