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

Posted zhou_chenz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式Linux系统的电子书阅读器项目1——Overview相关的知识,希望对你有一定的参考价值。

摘要:本项目是参考@韦东山的视频教程第三期嵌入式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)设备,以及背景和字体颜色相关的值。

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():

设置电子书的显示属性,显示设备与字体,背景颜色

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轴分辨率大小,以及每个字体的尺寸,及时定位新的显示光标,决定是否换行或页满翻到下一页。


以上是关于嵌入式Linux系统的电子书阅读器项目1——Overview的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式Linux系统的电子书阅读器项目4——Input Event System

嵌入式Linux系统的电子书阅读器项目3——Encode & Font System

Java精品项目项目源码第107期在线电子书小说阅读系统

嵌入式Linux文件系统保护

嵌入式Linux基础知识0(什么是真正的实时操作系统--硬实时 软实时)

嵌入式linux怎么学