国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng)

這篇具有很好參考價值的文章主要介紹了【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

最近看了 電子量產(chǎn)工具 這個項目,本專欄是對該項目的一個總結(jié)。


一、業(yè)務(wù)系統(tǒng)分析

【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng),電子量產(chǎn)工具,java,開發(fā)語言,linux,電子量產(chǎn)工具
前面實現(xiàn)了各個子系統(tǒng):顯示、輸入、文字、UI、頁面,它們只是提供基礎(chǔ)能力,跟業(yè)務(wù)邏輯沒有關(guān)系。這樣的架構(gòu)很容易擴展,可以在這上面實現(xiàn)各種業(yè)務(wù),對于不同的產(chǎn)品,我們只需要寫出自己頁面函數(shù)。

那么對于我們的帶電子量產(chǎn)工具,是怎么設(shè)置 的主頁面呢?

首先 觀賞 最終實驗效果:
可以看到在這個主界面上有很多按鍵,按鍵上有各自的名字。初始時,按鍵是紅色,當(dāng)點擊按鍵時,變成綠色。只有一些按鍵可以通過點擊改變顏色,有的可以通過網(wǎng)絡(luò)輸入改變顏色,甚至可以顯示進(jìn)度藍(lán)色。

【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng),電子量產(chǎn)工具,java,開發(fā)語言,linux,電子量產(chǎn)工具
可以創(chuàng)建一個配置文件 來描述各個按鍵的特點:
【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng),電子量產(chǎn)工具,java,開發(fā)語言,linux,電子量產(chǎn)工具
我們編寫 主頁面代碼時,需要先從配置文件中解析 出數(shù)據(jù),再根據(jù)數(shù)據(jù)生成按鈕。
當(dāng)有事件發(fā)生時,就可以找到對應(yīng)按鈕,再 根據(jù)配置文案金的數(shù)據(jù) 執(zhí)行相應(yīng)的 點擊函數(shù)。
【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng),電子量產(chǎn)工具,java,開發(fā)語言,linux,電子量產(chǎn)工具

二、處理配置文件

  1. 對于配置文件的每一行,都創(chuàng)建一個ItemCfg 結(jié)構(gòu)體。(每一個按鈕)
typedef struct ItemCfg {
	int index;
	char name[100];
	int bCanBeTouched;				// 是否可以被點擊
	char command[100];				// 狀態(tài)發(fā)生變化時 調(diào)用的命令
}ItemCfg, *PItemCfg;
  1. 解析配置文件。
int ParseConfigFile(void)
{
	FILE *fp;
	char buf[100];
	char *p = buf;
	
	/* 1. open config file */
	fp = fopen(CFG_FILE, "r");
	if (!fp)
	{
		printf("can not open cfg file %s\n", CFG_FILE);
		return -1;
	}

	while (fgets(buf, 100, fp))
	{
		/* 2.1 read each line */
		buf[99] = '\0';		

		/* 2.2 吃掉開頭的空格或TAB */
		p = buf;
		while (*p == ' ' || *p =='\t')
			p++;

		/* 2.3 忽略注釋 */
		if (*p == '#')
			continue;

		/* 2.4 處理 */
		g_tItemCfgs[g_iItemCfgCount].command[0] = '\0';
		g_tItemCfgs[g_iItemCfgCount].index = g_iItemCfgCount;
		sscanf(p, "%s %d %s", g_tItemCfgs[g_iItemCfgCount].name, &g_tItemCfgs[g_iItemCfgCount].bCanBeTouched, \
		                      g_tItemCfgs[g_iItemCfgCount].command);
		g_iItemCfgCount++;		
	}
	return 0;
}
  1. 獲取配置文件按鍵的數(shù)目。
int GetItemCfgCount(void)
{
	return g_iItemCfgCount;
}
  1. 根據(jù) 系數(shù) 和 名字 獲取配置文件。
PItemCfg GetItemCfgByIndex(int index)
{
	if (index < g_iItemCfgCount)
		return &g_tItemCfgs[index];
	else
		return NULL;
}

PItemCfg GetItemCfgByName(char *name)
{
	int i;
	for (i = 0; i < g_iItemCfgCount; i++)
	{
		if (strcmp(name, g_tItemCfgs[i].name) == 0)
			return &g_tItemCfgs[i];
	}
	return NULL;
}

三、生成界面

  1. 之前 在 頁面系統(tǒng) 中寫的是 默認(rèn)的按下函數(shù)。
    對于按鈕,我們要提供自己的OnPressed函數(shù),不適用UI系統(tǒng)默認(rèn)的函數(shù),這里編寫 main_page 按下函數(shù)。
static int MainPageOnPressed(struct Button *ptButton, PDispBuff ptDispBuff, PInputEvent ptInputEvent)
{
	unsigned int dwColor = BUTTON_DEFAULT_COLOR;
	char name[100];
	char status[100];
	char *strButton;

	strButton = ptButton->name;
	
	/* 1. 對于觸摸屏事件 */
	if (ptInputEvent->iType == INPUT_TYPE_TOUCH)
	{
		/* 1.1 分辨能否被點擊 */
		if (GetItemCfgByName(ptButton->name)->bCanBeTouched == 0)
			return -1;

		/* 1.2 修改顏色 */
		ptButton->status = !ptButton->status;
		if (ptButton->status)
			dwColor = BUTTON_PRESSED_COLOR;
	}
	else if (ptInputEvent->iType == INPUT_TYPE_NET)
	{
		/* 2. 對于網(wǎng)絡(luò)事件 */
		
		/* 根據(jù)傳入的字符串修改顏色 : wifi ok, wifi err, burn 70 */
		sscanf(ptInputEvent->str, "%s %s", name, status);
		if (strcmp(status, "ok") == 0)
			dwColor = BUTTON_PRESSED_COLOR;
		else if (strcmp(status, "err") == 0)
			dwColor = BUTTON_DEFAULT_COLOR;
		else if (status[0] >= '0' && status[0] <= '9')
		{			
			dwColor = BUTTON_PERCENT_COLOR;
			strButton = status;			
		}
		else
			return -1;
	}
	else
	{
		return -1;
	}

	/* 繪制底色 */
	DrawRegion(&ptButton->tRegion, dwColor);

	/* 居中寫文字 */
	DrawTextInRegionCentral(strButton, &ptButton->tRegion, BUTTON_TEXT_COLOR);

	/* 刷新界面到 lcd/web */
	FlushDisplayRegion(&ptButton->tRegion, ptDispBuff);
	return 0;
}
  1. 根據(jù)配置文件生成按鈕、界面:
    【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng),電子量產(chǎn)工具,java,開發(fā)語言,linux,電子量產(chǎn)工具
static void GenerateButtons(void)
{
	int width, height;
	int n_per_line;
	int row, rows;
	int col;
	int n;
	PDispBuff pDispBuff;
	int xres, yres;
	int start_x, start_y;
	int pre_start_x, pre_start_y;
	PButton pButton;
	int i = 0;
	
	/* 算出單個按鈕的width/height */
	g_tButtonCnt = n = GetItemCfgCount();
	
	pDispBuff = GetDisplayBuffer();
	xres = pDispBuff->iXres;
	yres = pDispBuff->iYres;
	width = sqrt(1.0/0.618 *xres * yres / n);
	n_per_line = xres / width + 1;
	width  = xres / n_per_line;
	height = 0.618 * width;	

	/* 居中顯示:  計算每個按鈕的region  */
	start_x = (xres - width * n_per_line) / 2;
	rows    = n / n_per_line;
	if (rows * n_per_line < n)
		rows++;
	
	start_y = (yres - rows*height)/2;

	/* 計算每個按鈕的region */
	for (row = 0; (row < rows) && (i < n); row++)
	{
		pre_start_y = start_y + row * height;
		pre_start_x = start_x - width;
		for (col = 0; (col < n_per_line) && (i < n); col++)
		{
			pButton = &g_tButtons[i];
			pButton->tRegion.iLeftUpX = pre_start_x + width;
			pButton->tRegion.iLeftUpY = pre_start_y;
			pButton->tRegion.iWidth   = width - X_GAP;
			pButton->tRegion.iHeigh   = height - Y_GAP;
			pre_start_x = pButton->tRegion.iLeftUpX;

			/* InitButton */
			InitButton(pButton, GetItemCfgByIndex(i)->name, NULL, NULL, MainPageOnPressed);
			i++;
		}
	}

	/* OnDraw */
	for (i = 0; i < n; i++)
		g_tButtons[i].OnDraw(&g_tButtons[i], pDispBuff);
}

四、根據(jù)輸入事件找到按鈕

對于觸摸屏事件,根據(jù)iX、iY找到按鈕.
對于網(wǎng)絡(luò)數(shù)據(jù),我們限定為這樣的格式:“name ok”、“name err”、“name 70%”根據(jù)name找到按鈕.

/*  判斷點擊的位置  */
static int isTouchPointInRegion(int iX, int iY, PRegion ptRegion)
{
	if (iX < ptRegion->iLeftUpX || iX >= ptRegion->iLeftUpX + ptRegion->iWidth)
		return 0;

	if (iY < ptRegion->iLeftUpY || iY >= ptRegion->iLeftUpY + ptRegion->iHeigh)
		return 0;

	return 1;
}
/*  根據(jù)輸入事件找到按鈕  */
static PButton GetButtonByInputEvent(PInputEvent ptInputEvent)
{
	int i;
	char name[100];
	
	if (ptInputEvent->iType == INPUT_TYPE_TOUCH)
	{
		for (i = 0; i < g_tButtonCnt; i++)
		{
			if (isTouchPointInRegion(ptInputEvent->iX, ptInputEvent->iY, &g_tButtons[i].tRegion))
				return &g_tButtons[i];
		}
	}
	else if (ptInputEvent->iType == INPUT_TYPE_NET)
	{
		sscanf(ptInputEvent->str, "%s", name);
		return GetButtonByName(name);
	}
	else
	{
		return NULL;
	}
	return NULL;
}
  1. 重寫 main_page.c 的 Run 函數(shù)。
static void MainPageRun(void *pParams)
{
	int error;
	InputEvent tInputEvent;
	PButton ptButton;
	PDispBuff ptDispBuff = GetDisplayBuffer();
	
	/* 讀取配置文件 */
	error = ParseConfigFile();
	if (error)
		return ;

	/* 根據(jù)配置文件生成按鈕、界面 */
	GenerateButtons();

	while (1)
	{
		/* 讀取輸入事件 */
		error = GetInputEvent(&tInputEvent);
		if (error)
			continue;

		/* 根據(jù)輸入事件找到按鈕 */
		ptButton = GetButtonByInputEvent(&tInputEvent);
		if (!ptButton)
			continue;

		/* 調(diào)用按鈕的OnPressed函數(shù) */
		ptButton->OnPressed(ptButton, ptDispBuff, &tInputEvent);
	}
}

五、業(yè)務(wù)系統(tǒng)總流程測試

【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng),電子量產(chǎn)工具,java,開發(fā)語言,linux,電子量產(chǎn)工具

測試效果:

【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng),電子量產(chǎn)工具,java,開發(fā)語言,linux,電子量產(chǎn)工具


總結(jié)

這個電子量產(chǎn)工具的項目就到這里結(jié)束了,后面繼續(xù)推出 面試筆試的 新專欄,幫助大家避開 筆試的坑。文章來源地址http://www.zghlxwxcb.cn/news/detail-542433.html

到了這里,關(guān)于【電子量產(chǎn)工具】6. 業(yè)務(wù)系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包