Linux基础项目开发1:量产工具——页面系统(六)

简介: Linux基础项目开发1:量产工具——页面系统(六)

一、数据结构抽象

很多产品的页面设计都有类似的效果,如以下这些系统的页面

对于每一个页面,抽象出如下结构体,

核心在于其中的Run函数:

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

第10行:注册一个页面

第11行:注册多个页面

第12行:在链表里找到同名的页面名字

二、页面管理器

页面管理器用来管理页面,只需要实现2个函数:

1. PagesRegister : 把多个页面注册进链表

2. Page(name) :取出某个页面

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 PagesRegister(void)
{
  extern void MainPageRegister(void);
  MainPageRegister();
}
 

第6行:存放链表头

第8~12行:链表,用于将页面头文件注册到链表里,与头文件进行链接

第14~26行:在链表中找到同名的页面

三、单元测试

创建一个PageAction MainPage:

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);
}

第7行:__FILE__文件,__FUNCTION__ 函数名,__LINE__ 行数

第17行:将构建的结构体注册进上层的页面管理器

2.page_test.c

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#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();
  Page("main")->Run(NULL);
  return 0; 
}
 
 

第16行:将页面管理器注册进去

第17行:调用Page里面的Run函数传入NULL

3.unitttest下的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

4.page下的Makefile

EXTRA_CFLAGS  := 
CFLAGS_file.o := 
 
obj-y += page_manager.o
obj-y += main_page.o

四、上板测试

1.ubuntu上

book@100ask:~/source$ make
book@100ask:~/source$ cp -r 23_page_unittest/ ~/nfs_rootfs/

2. 开发板上

[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

3.运行效果:


目录
相关文章
|
3天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
17 3
|
3天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
15 2
|
3天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
18 3
|
6天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
23 6
|
6天前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
30 6
|
7天前
|
机器学习/深度学习 自然语言处理 Linux
Linux 中的机器学习:Whisper——自动语音识别系统
本文介绍了先进的自动语音识别系统 Whisper 在 Linux 环境中的应用。Whisper 基于深度学习和神经网络技术,支持多语言识别,具有高准确性和实时处理能力。文章详细讲解了在 Linux 中安装、配置和使用 Whisper 的步骤,以及其在语音助手、语音识别软件等领域的应用场景。
29 5
|
7天前
|
监控 网络协议 算法
Linux内核优化:提升系统性能与稳定性的策略####
本文深入探讨了Linux操作系统内核的优化策略,旨在通过一系列技术手段和最佳实践,显著提升系统的性能、响应速度及稳定性。文章首先概述了Linux内核的核心组件及其在系统中的作用,随后详细阐述了内存管理、进程调度、文件系统优化、网络栈调整及并发控制等关键领域的优化方法。通过实际案例分析,展示了这些优化措施如何有效减少延迟、提高吞吐量,并增强系统的整体健壮性。最终,文章强调了持续监控、定期更新及合理配置对于维持Linux系统长期高效运行的重要性。 ####
|
11天前
|
缓存 监控 Linux