前言:
前面我们已经将显示系统、输入系统、文字系统、UI系统全部搭建好了,下面就到了开发板页面的布局,也就是实现按钮在开发板页面上的每个位置,下面让我们一起实现页面的搭建与布局设计吧。
目录
一、数据结构抽象
page_manager.h
二、页面管理器
page_manager.c
三、单元测试
1.main_page.c
2.page_test.c
3.unitttest下的Makefile
4.page下的Makefile
四、上板测试
1.ubuntu上
2. 开发板上
3.运行效果:
一、数据结构抽象
很多产品的页面设计都有类似的效果,如以下这些系统的页面
对于每一个页面,抽象出如下结构体,
核心在于其中的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