文章目录
- 一、数据结构抽象
- page_manager.h
- 二、页面管理器
- page_manager.c
- 三、单元测试
- 1、main.page.c
- 2、page_test.c
- 3、Makefile修改
- 3.1、unittest中的Makefile
- 3.2、page中的Makefile
- 四、上机实验
前言
前面实现了显示、输入、文字、UI系统,现在我们就来实现页面的搭建!
一、数据结构抽象
对于每一个页面都会有一个结构体!
对于每一个结构体抽象出的结构体如下:
page_manager.h
#ifndef _PAGE_MANAGER_H
#define _PAGE_MANAGER_H
/* 定义一个结构体,用于表示页面操作 */
typedef struct PageAction {
char *name; //页面名称
void (*Run)(void *pParams); //指向页面操作函数
struct PageAction *ptNext; //链表
}PageAction, *PPageAction;
/* 声明函数,用于注册页面 */
void PageRegister(PPageAction ptPageAction);
/* 声明函数,用于注册所有页面 */
void PagesRegister(void);
/* 声明函数,用于根据页面寻找动作名称查找并返回对应的结构体 */
PPageAction Page(char *name);
#endif
二、页面管理器
页面管理器用于管理页面,需要实现上层函数!
page_manager.c
page_manager.c里面就是实现了page_manager.h里面的那三个函数
// 包含公共头文件,可能包含了一些通用的宏定义或者函数声明
#include <common.h>
// 包含页面管理器头文件,这个文件中声明了页面动作相关的结构体和函数
#include <page_manager.h>
// 包含字符串处理头文件,提供了字符串比较函数strcmp
#include <string.h>
// 声明一个静态的全局变量,用于存储页面动作链表的头指针
static PPageAction g_ptPages = NULL;
// 实现页面动作注册函数,将新的页面动作添加到链表的头部
void PageRegister(PPageAction ptPageAction)
{
// 将新动作的下一个指针指向当前链表的头
ptPageAction->ptNext = g_ptPages;
// 更新链表头指针,使其指向新添加的动作
g_ptPages = ptPageAction;
}
// 实现根据名称查找页面动作的函数
PPageAction Page(char *name)
{
// 从链表头开始遍历
PPageAction ptTmp = g_ptPages;
// 遍历链表直到找到匹配的名称或者遍历完整个链表
while (ptTmp)
{
// 使用strcmp函数比较名称是否相等
if (strcmp(name, ptTmp->name) == 0)
// 如果找到匹配的名称,返回对应的页面动作指针
return ptTmp;
// 移动到下一个页面动作
ptTmp = ptTmp->ptNext;
}
// 如果没有找到匹配的名称,返回NULL
return NULL;
}
// 实现注册所有页面动作的函数
void PagesRegister(void)
{
// 声明一个外部函数,用于注册主页面动作
extern void MainPageRegister(void);
// 调用外部函数注册主页面动作
MainPageRegister();
}
三、单元测试
1、main.page.c
// 包含页面管理器头文件,这个文件中声明了页面动作相关的结构体和函数
#include <page_manager.h>
// 包含标准输入输出头文件,提供了printf等函数
#include <stdio.h>
// 定义一个静态函数,用于执行主页面动作
static void MainPageRun(void *pParams)
{
// 使用printf打印文件名、函数名和当前行号,用于调试信息
printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}
// 定义一个静态的PageAction结构体变量,表示主页面动作
static PageAction g_tMainPage = {
// 设置页面动作的名称为"main"
.name = "main",
// 设置执行页面动作的函数为MainPageRun
.Run = MainPageRun,
};
// 定义一个函数,用于注册主页面动作
void MainPageRegister(void)
{
// 调用页面管理器的注册函数,将主页面动作添加到页面动作链表中
PageRegister(&g_tMainPage);
}
__FILE__文件,FUNCTION 函数名,LINE 行数
2、page_test.c
// 包含内存映射相关的头文件
#include <sys/mman.h>
// 包含系统类型定义的头文件
#include <sys/types.h>
// 包含文件状态相关的头文件
#include <sys/stat.h>
// 包含Unix标准函数定义的头文件
#include <unistd.h>
// 包含Linux帧缓冲设备相关的头文件
#include <linux/fb.h>
// 包含文件控制选项相关的头文件
#include <fcntl.h>
// 包含标准输入输出函数定义的头文件
#include <stdio.h>
// 包含字符串处理函数定义的头文件
#include <string.h>
// 包含输入输出控制函数定义的头文件
#include <sys/ioctl.h>
// 包含标准库函数定义的头文件
#include <stdlib.h>
// 包含页面管理器头文件,这个文件中声明了页面动作相关的结构体和函数
#include <page_manager.h>
// 程序入口点,接受命令行参数
int main(int argc, char **argv)
{
// 注册所有页面动作,这通常会在程序启动时执行
PagesRegister();
// 查找名为"main"的页面动作,并执行其Run函数
// 这里传递了一个NULL参数,表示没有额外的参数传递给Run函数
Page("main")->Run(NULL);
// 程序正常退出,返回0
return 0;
}
3、Makefile修改
3.1、unittest中的Makefile
EXTRA_CFLAGS :=
CFLAGS_file.o :=
#obj-y += disp_test.o
#obj-y += input_test.o
#obj-y += font_test.o
#obj-y += ui_test.o
obj-y += page_test.o
3.2、page中的Makefile
EXTRA_CFLAGS :=
CFLAGS_file.o :=
obj-y += page_manager.o
obj-y += main_page.o
四、上机实验
book@100ask:~/source$ make
book@100ask:~/source$ cp -r 23_page_unittest/ ~/nfs_rootfs/
[root@100ask:/]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
//挂载目录
[root@100ask:/mnt/23_page_unittest]# ./test ./simsun.ttc
上机运行效果: