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

文章目录

  • 一、数据结构抽象
    • 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;}// 如果没有找到匹配的名称,返回NULLreturn 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);// 程序正常退出,返回0return 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure树形菜单展开与折叠

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;Axure树形菜单展开与折叠 主要内容&#xff1a;树形菜单制作——层级关系——隐藏与显示——值的变化——多层交互 应用场景&#xff1a;关系树、菜…

Python学习的自我理解和想法(15)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第15天&#xff0c;从今天开始&#xff0c;每天一到两个常用模块&#xff0c;更完恢复到原来的&#xff0c;开学了&#xff0c;时间不多&am…

Java 直接获取 pom.xml 配置的属性值

Java 直接获取 pom.xml 配置的属性值 1.需求描述2.代码示例3.结果演示 系统&#xff1a;Win10 JDK&#xff1a;1.8.0_351 IDEA&#xff1a;2022.3.3 1.需求描述 在开发一个 SpringBoot 项目的时候&#xff0c;需要从 pom.xml 中获取配置的 artifactId&#xff0c;name&#xf…

vscode配置ssh远程连接服务器

注意&#xff1a;重启软件或重启电脑&#xff0c;解决很多问题 一. vscode配置ssh vscode通过ssh连接服务器&#xff08;吐血总结&#xff09;_vscode ssh-CSDN博客 二. VScode无法远程连接主机问题 VSCode远程连接服务器报错&#xff1a;Could not establish connection to…

HCIP-HarmonyOS Application Developer 习题(十六)

&#xff08;判断&#xff09;1、HiLink通过分布式软总线的方式连接所有设备&#xff0c;强能力设备可对弱能力设备进行设备虚拟化&#xff0c;将弱设备当做本机设备直接调用。 答案&#xff1a;错误 分析&#xff1a;HiLink 主要针对的是应用开发者与第三方设备开发者&#xf…

力扣 中等 143.重排链表

文章目录 题目介绍题解 题目介绍 题解 class Solution {public void reorderList(ListNode head) {ListNode mid middleNode(head);ListNode head2 reverseList(mid);while (head2.next ! null) {ListNode nxt head.next;ListNode nxt2 head2.next;head.next head2;head2.…

Linux-正则表达式

正则表达式 定义DRE模式-纯文本/特殊字符 定义DRE模式-锚字符/点号字符 定义DRE模式-字符组/排除型字符组 定义DRE模式-区间 定义DRE模式-特殊字符组 定义DRE模式-星号 扩展正则表达式-问号 扩展正则表达式-加号 扩展正则表达式-使用花括号 扩展正则表达式-管道符号/表达式分组…

如何通过CDN优化网站服务器访问速度?

CDN&#xff0c;即内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;在现代互联网中起着重要作用。它可以显著提升网站服务器的访问速度。以下是CDN在加速网站访问方面的主要优势及其工作原理。 1. 全球分布的服务器节点 CDN通过在全球范围内布设多个…

【Router】路由器中NAT、NAPT、NPT是什么?

参考链接 NAT vs. NAPT: What’s the Difference? IPv6 Network Prefix Translation (NPt) | pfSense Documentation (netgate.com) 趣谈NAT/NAPT的原理&#xff0c;这篇不可不读&#xff01; - 知乎 (zhihu.com) NAT (Network Address Translation) NAT说明 NAT&#x…

成都睿明智科技有限公司电商服务可靠不?

在这个短视频风起云涌的时代&#xff0c;抖音不仅成为了人们娱乐消遣的首选平台&#xff0c;更是众多商家竞相追逐的电商新蓝海。成都睿明智科技有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;正以其独到的洞察力和专业的服务&#xff0c;助力无数品牌在这片沃…

微信小程序:miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具

微信小程序&#xff1a;miniprogram-ci自动打包工具使用介绍以及支持配置环境变量、jekins打包、taro、uni-app三方工具 背景介绍 一直都是本地电脑运行微信开发者工具打包上传。多项目中新老版本对node版本要求不一致&#xff0c;老是切来切去。而且同一个人开发上传需要打包…

pandas-使用技巧

pandas-使用技巧 简单技巧 仅个人笔记使用&#xff0c;感谢点赞关注 简单技巧 pd.to_dict()&#xff1a;Dataframe格式数据转字典数据pd.dropna()&#xff1a;去nan值& | ~&#xff1a;pd逻辑运算符pd.isnan()&#xff1a;判断是否为nan值pd.concat&#xff1a;多个pd拼接…

李宏毅机器学习2022-HW7-BERT-Question Answering

文章目录 TaskBaselineMediumStrongBoss Code Link Task HW7的任务是通过BERT完成Question Answering。 数据预处理流程梳理 数据解压后包含3个json文件&#xff1a;hw7_train.json, hw7_dev.json, hw7_test.json。 DRCD: 台達閱讀理解資料集 Delta Reading Comprehension …

openpnp - 底部相机视觉识别CvPipeLine的参数bug修正

文章目录 openpnp - 底部相机视觉识别的CvPipeLine的参数bug概述笔记openpnp的视觉识别参数的错误原因备注END openpnp - 底部相机视觉识别的CvPipeLine的参数bug 概述 底部相机抓起一个SOD323的元件&#xff0c;进行视觉识别。 识别出的矩形错了&#xff0c;是一个很长的长方…

Qt_软件添加版本信息

文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO

TEI text-embeddings-inference文本嵌入模型推理框架

参看: https://github.com/huggingface/text-embeddings-inference#docker 文本嵌入模型榜单 https://huggingface.co/spaces/mteb/leaderboard bge模型下载 https://huggingface.co/BAAI/bge-m3/tree/main export HF_ENDPOINT=https://hf-mirror.comhuggingface-cli dow…

STM32-HAL库 - MAX30102心率血氧传感器 —— 2024.10.15

一、教程简介 本教程使用CubeMX配合Keil5编写代码&#xff0c;带你10分钟拿下MAX30102。在官方例程的基础上进行移植和封装&#xff0c;测量数据准确。采用模拟I2C&#xff0c;任意三个引脚均可驱动。 二、MAX30102简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器…

Tortoise SVN 安装汉化教程(乌龟SVN)

1.首先下载 去官网下载 如果下载比较慢的&#xff0c;链接自取 https://pan.quark.cn/s/cb6f2eee3f90 2. 安装Tortoise SVN 无脑next到完成 最后到桌面右键 你就发现svn出来了&#xff0c;但是是英文的&#xff01;&#xff01;&#xff01;&#xff01; 像我这种英文不好的…

流体力学笔记

目录 1、名词2、湍流与涡流3 涡激振动4 压力面与吸力面参考&#xff1a;[空气动力学的“他山之石”](https://zhuanlan.zhihu.com/p/412542513) 1、名词 转列&#xff1a;transition 涡脱落&#xff1a;vortex shedding 涡分离&#xff1a;vortex rupture 气动噪声&#xff1a…

【java Web如何开发?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…