分类: 嵌入式
2015-08-23 16:47:12
Main.c
15年8月23日16:18:56
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <config.h>
#include <draw.h>
#include <encoding_manager.h>
#include <fonts_manager.h>
#include <disp_manager.h>
#include <string.h>
/* ./show_file [-s Size] [-f freetype_font_file] [-h HZK] <text_file> */
int main(int argc, char **argv)
{
int iError;
unsigned int dwFontSize = 16;
char acHzkFile[128];
char acFreetypeFile[128];
char acTextFile[128];
char acDisplay[128];
char cOpr;
int bList = 0;
acHzkFile[0] = '\0';
acFreetypeFile[0] = '\0';
acTextFile[0] = '\0';
strcpy(acDisplay, "fb");
while ((iError = getopt(argc, argv, "ls:f:h:d:")) != -1)
{
switch(iError)
{
case 'l':
{
bList = 1;
break;
}
case 's':
{
dwFontSize = strtoul(optarg, NULL, 0);
break;
}
case 'f':
{
strncpy(acFreetypeFile, optarg, 128);
acFreetypeFile[127] = '\0';
break;
}
case 'h':
{
strncpy(acHzkFile, optarg, 128);
acHzkFile[127] = '\0';
break;
}
case 'd':
{
strncpy(acDisplay, optarg, 128);
acDisplay[127] = '\0';
break;
}
default:
{
printf("Usage: %s [-s Size] [-d display] [-f font_file] [-h HZK] <text_file>\n", argv[0]);
printf("Usage: %s -l\n", argv[0]);
return -1;
break;
}
}
}
if (!bList && (optind >= argc))
{
printf("Usage: %s [-s Size] [-d display] [-f font_file] [-h HZK] <text_file>\n", argv[0]);
printf("Usage: %s -l\n", argv[0]);
return -1;
}
iError = DisplayInit();
if (iError)
{
printf("DisplayInit error!\n");
return -1;
}
iError = FontsInit();
if (iError)
{
printf("FontsInit error!\n");
return -1;
}
iError = EncodingInit();
if (iError)
{
printf("EncodingInit error!\n");
return -1;
}
if (bList)
{
printf("supported display:\n");
ShowDispOpr();
printf("supported font:\n");
ShowFontOpr();
printf("supported encoding:\n");
ShowEncodingOpr();
return 0;
}
strncpy(acTextFile, argv[optind], 128);
acTextFile[127] = '\0';
iError = OpenTextFile(acTextFile);
if (iError)
{
printf("OpenTextFile error!\n");
return -1;
}
iError = SetFontsDetail(acHzkFile, acFreetypeFile, dwFontSize);
if (iError)
{
printf("SetTextDetail error!\n");
return -1;
}
DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
iError = SelectAndInitDisplay(acDisplay);
if (iError)
{
printf("SelectAndInitDisplay error!\n");
return -1;
}
DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
iError = ShowNextPage();
DBG_PRINTF("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
if (iError)
{
printf("Error to show first page\n");
return -1;
}
while (1)
{
printf("Enter 'n' to show next page, 'u' to show previous page, 'q' to exit: ");
do {
cOpr = getchar();
} while ((cOpr != 'n') && (cOpr != 'u') && (cOpr != 'q'));
if (cOpr == 'n')
{
ShowNextPage();
}
else if (cOpr == 'u')
{
ShowPrePage();
}
else
{
return 0;
}
}
return 0;
}
想要理解那些文件的关系,最好的开始方式是从main函数开始分析:
(1)main函数开始用一个getopt函数来选择输入输入选项,这个函数的介绍可以去参考《UNIX环境高级编程》书里面。暂时不分析,先分析函数的执行步骤。
(2)DisplayInit()函数,调用FBInit()函数将g_tFBDispOpr结构体添加到g_ptDispOprHead;链表中。
(3)FontsInit()函数,分别调用ASCIIInit(), GBKInit(), FreeTypeInit()三个函数,分别将g_tASCIIFontOpr,g_tGBKFontOpr, g_tFreeTypeFontOpr三个结构体,注册到 g_ptFontOprHead链表中。这样这个链表中就有3项了~
(4)EncodingInit()函数,分别调用AsciiEncodingInit(), Utf16leEncodingInit(), Utf16beEncodingInit(), Utf8EncodingInit()四个函数,这四个函数分别将g_tAsciiEncodingOpr, g_tUtf16leEncodingOpr, g_tUtf16beEncodingOpr, g_tUtf8EncodingOpr这四个结构体注册到g_ptEncodingOprHead链表中,但是在注册到链表之前,对于每一个结构体,先将每种编码方式支持的字体添加到对应结构体里面的ptFontOprSupportedHead链表中。
(5)如果输入了”l”选项,就将bList设置为1了,这样就打印出一些设备,字体,编码支持信息。
(6)OpenTextFile()函数,根据传入的acTextFile参数,打开文件,获取文件信息,然后映射到内存中,调用SelectEncodingOprForFile()函数,来选择文件支持的编码方式,这个函数返回的结构体存在g_ptEncodingOprForFile中,如果确定编码的话,就可以确定g_pucLcdFirstPosAtFile参数,这样就可以从这个位置取编码了。
(7)获取编码以后,调用SetFontsDetail()函数来设置字体细节,这个函数根据g_ptEncodingOprForFile->ptFontOprSupportedHead这个链表选取编码支持的字体进行设置。
(8)SelectAndInitDisplay()函数根据acDisplay这个参数选择显示的设备,从g_ptDispOpr链表中选择与acDisplay名字相同的设备,并初始化它。
(9)以上步骤完成以后,就可以调用ShowNextPage()函数了,pucTextFileMemCurPos = g_pucLcdFirstPosAtFile,然后调用ShowOnePage(pucTextFileMemCurPos)函数来显示一页,ShowOnePage函数从内存中一一取出编码,根据编码选择字体,然后显示,直到文件结束或者满屏了。如果显示一页成功以后,在ShowNextPage函数中记录下这一页的信息。
(10)main函数进入while循环来等待用户输入。