摘要:本项目是参考@
韦东山的视频教程第三期嵌入式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轴分辨率大小,以及每个字体的尺寸,及时定位新的显示光标,决定是否换行或页满翻到下一页。