Linux基础项目开发day05:量产工具——页面系统

时间:2024-10-20 19:02:15

文章目录

  • 一、数据结构抽象
    • 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

上机运行效果:
在这里插入图片描述