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

文章目录

前言

前面实现了显示、输入、文字、UI系统,现在我们就来实现页面的搭建!

一、数据结构抽象

对于每一个页面都会有一个结构体!

对于每一个结构体抽象出的结构体如下:

page_manager.h

c 复制代码
#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里面的那三个函数

c 复制代码
// 包含公共头文件,可能包含了一些通用的宏定义或者函数声明
#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

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

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

c 复制代码
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

c 复制代码
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

上机运行效果:

相关推荐
byte轻骑兵4 分钟前
嵌入式 ARM Linux 系统构成全解:从硬件到应用层层剖析
linux·arm开发·arm·嵌入式开发
Oliver_LaVine19 分钟前
linux搭建Gray
运维
gobeyye26 分钟前
Docker 用法详解
运维·docker·容器
小灰灰__44 分钟前
Linux离线安装Docker命令,简单镜像操作
linux·docker·eureka
AI视觉网奇1 小时前
pytorch3d linux安装
linux·人工智能·pytorch
VVVVWeiYee1 小时前
Mesh路由组网
运维·网络·智能路由器·信息与通信
双手插兜-装高手1 小时前
Linux - 线程基础
linux·c语言·笔记
IT枫斗者2 小时前
如何解决Java EasyExcel 导出报内存溢出
java·服务器·开发语言·网络·分布式·物联网
XY.散人2 小时前
初识Linux · 信号处理
linux·信号处理
北'辰2 小时前
使用ENSP实现DHCP+动态路由
运维·网络