目录
前言
一、产品页面数据结构抽象
1. page_manager.h
二、产品页面管理器
1.page_manager.c
三、产品页面运行
1.main_page.c
四、单元测试
1.page_test.c
2.上机测试
前言
前面我们实现了显示系统框架,输入系统框架,文字系统框架和UI系统框架,链接:
- 量产工具一一显示系统(一)-CSDN博客
- 量产工具一一输入系统(二)-CSDN博客
- 量产工具一一文字系统(三)-CSDN博客
- 量产工具一一UI系统(四)-CSDN博客
接下来我们来实现页面系统框架。
一、产品页面数据结构抽象
很多产品的页面设计都有类似的效果,如以下这些系统的页面:对于每一个页面,我们可以抽象出其结构体
1. 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 PageSystemRegister(void); // 注册所有页面
PPageAction Page(char *name);
#endif
二、产品页面管理器
1.page_manager.c
#include <common.h>
#include <page_manager.h>
#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)
{
if (strcmp(name, ptTmp->name) == 0)
return ptTmp;
ptTmp = ptTmp->ptNext;
}
return NULL;
}
void PageSystemRegister(void)
{
extern void MainPageRegister(void);
MainPageRegister();
}
三、产品页面运行
1.main_page.c
#include <page_manager.h>
#include <stdio.h>
static void MainPageRun(void *pParams)
{
printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}
static PageAction g_tMainPage = {
.name = "main",
.Run = MainPageRun,
};
void MainPageRegister(void)
{
PageRegister(&g_tMainPage);
}
四、单元测试
1.page_test.c
#include <sys/mman.h> // 包含内存映射相关的头文件
#include <sys/types.h> // 包含系统类型定义的头文件
#include <sys/stat.h> // 包含文件状态相关的头文件
#include <unistd.h> // 包含Unix标准函数定义的头文件
#include <linux/fb.h> // 包含Linux帧缓冲设备相关的头文件
#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)
{
PageSystemRegister();
/* 查找名为"main"的页面动作,并执行其Run函数 */
/* 这里传递了一个NULL参数,表示没有额外的参数传递给Run函数 */
Page("main")->Run(NULL);
return 0;
}
2.上机测试
上电开发板,挂载 Ubuntu 的 NFS 目录,编译测试: