《Zigbee開發(fā)技術(shù)及實(shí)踐》課件第7章_第1頁
《Zigbee開發(fā)技術(shù)及實(shí)踐》課件第7章_第2頁
《Zigbee開發(fā)技術(shù)及實(shí)踐》課件第7章_第3頁
《Zigbee開發(fā)技術(shù)及實(shí)踐》課件第7章_第4頁
《Zigbee開發(fā)技術(shù)及實(shí)踐》課件第7章_第5頁
已閱讀5頁,還剩259頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第7章Zstack系統(tǒng)移植7.1工程模板的創(chuàng)建7.2任務(wù)的建立7.3移植

掌握工程模板的建立。

掌握任務(wù)的建立。

掌握LED、按鍵和LCD的移植。

【描述7.D.】

以GenericApp為基礎(chǔ)新建一個名為DongheApp的空工程模板。

【描述7.D.2】

在7.D.1工程模板的基礎(chǔ)上,添加用戶任務(wù)。

【描述7.D.3】

在7.D.2的基礎(chǔ)上,進(jìn)行LED移植。

【描述7.D.4】

在7.D.3的基礎(chǔ)上,進(jìn)行按鍵的移植。

【描述7.D.5】

在7.D.4的基礎(chǔ)上,進(jìn)行LCD的移植。

在Zstack應(yīng)用開發(fā)中首先要建立自己的工程模板,然后在新建的工程模板中根據(jù)項目的需求建立自己的任務(wù)和任務(wù)處理函數(shù),并且需要用戶根據(jù)自己的開發(fā)板資源修改官方Zstack協(xié)議棧。7.1工程模板的創(chuàng)建由于Zstack協(xié)議的半開源性,在MAC層和網(wǎng)絡(luò)層幾乎不用修改,用戶的開發(fā)大多建立在應(yīng)用層,即Zstack協(xié)議棧的APP層。一個新的工程若是從零開始需要做大量的工作(如Zstack文件的添加、編譯參數(shù)的設(shè)置等),因此在TI官方附帶的例子的基礎(chǔ)上進(jìn)行修改是一個捷徑(例如,用戶建立自己的工程模板可以在TI官方協(xié)議棧的GenericApp、SampleApp和SimpleApp例程的基礎(chǔ)上進(jìn)行)。下述內(nèi)容用以實(shí)現(xiàn)任務(wù)描述7.D.1,以GenericApp為基礎(chǔ)新建一個名為DongheApp的空工程模板。建立一個新的工程需要以下三個步驟:

(1)工程的建立以及命名。

(2)添加文件。

(3)編譯選項的設(shè)置。

7.1.1工程的建立

1.給新建工程命名

在“Projects\zstack\Samples\GenericApp\CC2530DB”的目錄下找到GenericApp.eww、GenericApp.ewp和GenericApp.ewd三個文件,如圖7-1所示。

圖7-1CC2530DB目錄將GenericApp.eww、GenericApp.ewp和GenericApp.ewd三個文件重命名為DongheApp.eww、DongheApp.ewp和DongheApp.ewd三個文件,如圖7-2所示。

圖7-2修改名稱后的文件

2.修改工程文件

分別用“記事本”方式打開三個文件,如圖7-3所示。

將文件中的GenericApp全部替換為DongheApp,如圖7-4所示。

然后雙擊打開DongheApp.eww文件,可以看到工程名變?yōu)镈ongheApp,如圖7-5所示。

圖7-3打開方式

圖7-4查找替換

圖7-5打開DongheApp.eww

7.1.2修改App目錄

修改App目錄需要以下幾個步驟。

(1)建立新的源文件:將原來工程的應(yīng)用層源文件刪除,并添加新工程的源文件。

(2)子目錄的建立:將原來App目錄下所有的文件全部刪除,添加新工程的簇文件。

(3)子目錄文件的建立:將新工程的源文件添加至子目錄文件中。

1.建立新的源文件

將“Projects\zstack\Samples\GenericApp\Source”目錄下的GenericApp.c、GenericApp.h和OSAL_GenericApp.c文件全部刪除掉,如圖7-6所示。

在“Projects\zstack\Samples\GenericApp\Source”目錄下添加DongheAppCooder.c、OSAL_DongheAppCooder.c、OSAL_DongheCooder.h、DongheAppRouter.c、OSAL_Donghe-AppRouter.c、OSAL_DongheRouter.h和DongheApp.h共7個空文件,如圖7-7所示。

圖7-6Source目錄

圖7-7新建Source文件

2.子目錄的建立

將DongheApp工程中App目錄下所有的3個文件刪除掉,如圖7-8所示。

圖7-8刪除App目錄下的文件在TI的官方程序中,協(xié)調(diào)器程序、路由器程序和終端節(jié)點(diǎn)的程序都在同一個文件中,程序的可讀性不強(qiáng)。為了使用戶能夠區(qū)分協(xié)調(diào)器程序和路由器程序,本次新建的工程將把協(xié)調(diào)器程序和路由器或終端節(jié)點(diǎn)的程序區(qū)分開。

在空的App文件目錄下面新建兩個子目錄,分別命名為協(xié)調(diào)器子目錄“Cooder”以及路由器或終端設(shè)備子目錄“Router”(因為在應(yīng)用層的路由器程序和終端節(jié)點(diǎn)的程序區(qū)別很小,因此將兩者放在同一個程序文件中,存放在“Router”簇中),具體操作為右擊APP,選擇“Option→Add→AddGroup”選項,如圖7-9所示。

點(diǎn)擊AddGroup,會彈出如圖7-10所示的對話框。

在對話框中寫入“Cooder”或者“Router”,點(diǎn)擊OK按鈕即可將簇添加至App文件中。添加完成之后如圖7-11所示。

圖7-9添加簇

圖7-10簇命名

圖7-11新建的App目錄

3.子目錄文件的建立

右擊Cooder子目錄,通過“Add→AddFiles”的方式添加Cooder子目錄下的文件,如圖7-12所示。

圖7-12添加文件選擇Source目錄下的DongheAppCooder.c、OSAL_DongheAppCooder.c以及DongheAppCooder.h文件添加至Cooder子目錄中,如圖7-13所示。

以同樣的方式將DongheAppRouter.c、OSAL_DongheAppRouter.c以及OSAL_Donghe-Router.h文件添加至Router子目錄中,最后將DongheApp.h文件添加至App目錄中,結(jié)果如圖7-14所示。

圖7-13選擇要添加的文件

圖7-14文件添加完畢

注意:此處的DongheApp.h也可以不添加到APP目錄下,因為在DongheAppCooder.c文件和DongheAppRouter.c文件中都包含了此文件。此處為了方便理解DongheApp.h為一個Cooder和Router共用的頭文件,因此將此文件添加至APP層的根目錄下。

7.1.3編譯選項的選擇

以上章節(jié)介紹了應(yīng)用層App目錄的建立,其中新建的Cooder子目錄是為協(xié)調(diào)器建立的,里面包含了有關(guān)協(xié)調(diào)器代碼的文件,新建的Router子目錄是為路由器和終端設(shè)備建立的,里面包含了有關(guān)路由器設(shè)備和終端設(shè)備的代碼(在實(shí)際應(yīng)用中,有時候路由器設(shè)備的代碼和終端設(shè)備的代碼是相同的,只是由于編譯選項的不同,使得路由器代碼具有路由轉(zhuǎn)發(fā)數(shù)據(jù)的功能,而終端設(shè)備代碼沒有路由轉(zhuǎn)發(fā)數(shù)據(jù)的功能)。在實(shí)際應(yīng)用中需要將不同子目錄對應(yīng)不同的編譯選項,例如,協(xié)調(diào)器的子目錄要對應(yīng)協(xié)調(diào)器的編譯選項,路由器和終端設(shè)備的子目錄要分別對應(yīng)路由器和終端設(shè)備的編譯選項。下面以協(xié)調(diào)器子目錄編譯選項的設(shè)置為例來講解編譯選項的選擇。例如,當(dāng)選擇CoodinatorEB時,可以看到在Tools目錄下選擇編譯的是f8w2530.xcl、f8wConfig.cfg、f8wCoord.cfg文件,而f8wEndev.cfg和f8wRouter.cfg文件的圖標(biāo)變?yōu)榛疑?,如圖7-15所示。

協(xié)調(diào)器對應(yīng)的子目錄為Cooder,所以當(dāng)編譯協(xié)調(diào)器時,應(yīng)當(dāng)屏蔽掉Router子目錄的編譯。右擊Router子目錄,選擇Options彈出對話框,將對話框左上角的“Excludefrombulid”選項勾上,然后點(diǎn)擊OK按鈕即可,如圖7-16所示。按照以上步驟,在選擇RouterEB時,應(yīng)該將Cooder子目錄屏蔽。在選擇EndDeviceEB選項時,也將Cooder子目錄屏蔽掉。

OSAL_DongheAppCooder.c和DongheAppCooder.c為協(xié)調(diào)器的應(yīng)用層文件,OSAL_DongheApp-Router.c和DongheAppRouter.c是路由器和終端設(shè)備的應(yīng)用層文件。其中OSAL_DongheAppCooder.c和OSAL_DongheAppRouter.c的主要功能是為任務(wù)分配內(nèi)存空間和ID號,DongheAppCooder.c和DongheAppRouter.c的主要功能是對任務(wù)進(jìn)行初始化和事件處理。

圖7-15協(xié)調(diào)器編譯選項的選擇

圖7-16屏蔽編譯子目錄在OSAL_DongheCooder.h和OSAL_DongheRouter.h兩個頭文件中,分別寫入如下代碼:

【描述7.D.1】OSAL_DongheCooder.h

#ifndefOSAL_DONGHE_COODER_H

#defineOSAL_DONGHE_COODER_H

#include"ZComDef.h"

#include"OSAL_Tasks.h"

#include"mac_api.h"

#include"nwk.h"

#include"hal_drivers.h"

#include"aps.h"

#include"ZDApp.h"

#endif

【描述7.D.1】OSAL_DongheRouter.h

#ifndefOSAL_DONGHE_ROUTER_H

#defineOSAL_DONGHE_ROUTER_H

#include"ZComDef.h"

#include"OSAL_Tasks.h"

#include"mac_api.h"

#include"nwk.h"

#include"hal_drivers.h"

#include"aps.h"

#include"ZDApp.h"

#endif

在OSAL_DongheAppCooder.c和OSAL_DongheAppRouter.c代碼中寫入如下代碼:

【描述7.D.1】OSAL_DongheAppCooder.c、OSAL_DongheAppRouter.c

//事件處理函數(shù)

constpTaskEventHandlerFntasksArr[]={

//MAC層處理函數(shù)

macEventLoop,

//網(wǎng)絡(luò)層處理函數(shù)

nwk_event_loop,

//Hal層處理函數(shù)

Hal_ProcessEvent,

//APS層處理函數(shù)

APS_event_loop,

//ZDO層處理函數(shù)

ZDApp_event_loop,

};

//保存當(dāng)前任務(wù)數(shù)

constuint8tasksCnt=sizeof(tasksArr)/sizeof(tasksArr[0]);

uint16*tasksEvents=NULL;

/*********************************************************************

*@fnosalInitTasks

****************************************************************/

//任務(wù)初始化函數(shù)

voidosalInitTasks(void)

{

uint8taskID=0;

//為任務(wù)分配空間

tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);

osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt));

//MAC層任務(wù)初始化

macTaskInit(taskID++);

//網(wǎng)絡(luò)層任務(wù)初始化

nwk_init(taskID++);

//HAL層任務(wù)初始化

Hal_Init(taskID++);

//APS層任務(wù)初始化

APS_Init(taskID++);

//ZDO層任務(wù)初始化

ZDApp_Init(taskID++);

}

OSAL_DongheAppCooder.c和OSAL_DongheAppRouter.c兩個文件中要包含的頭文件是不同的,OSAL_DongheCooder.c中包含的頭文件為

#include"OSAL_DongheCooder.h"

OSAL_DongheAppRouter.c中包含的頭文件為

#include"OSAL_DongheRouter.h"

到此為止,一個空的工程模板建立完成,可以通過“Project

RubildAll”編譯此工程文件,編譯結(jié)構(gòu)如圖7-17所示。

圖7-17工程的編譯

上述7.1節(jié)在APP應(yīng)用層建立了兩個子目錄,即Cooder子目錄和Router子目錄,分別存放協(xié)調(diào)器和路由器(終端)設(shè)備的代碼文件,因此在建立任務(wù)時需要將協(xié)調(diào)器和路由器(終端設(shè)備)的代碼分開來寫,添加任務(wù)需要在Cooder和Router子目錄中分別添加。下述內(nèi)容將實(shí)現(xiàn)任務(wù)描述7.D.2,在7.D.1工程模板的基礎(chǔ)上,添加用戶任務(wù)。7.2任務(wù)的建立用戶任務(wù)的添加需要以下幾個步驟。

(1)函數(shù)的聲明:在OSAL_DongheCooder.h和OSAL_DongheRouter.h文件中聲明用戶自定義的任務(wù)初始化函數(shù)和與其相對應(yīng)的事件處理函數(shù)。

(2)任務(wù)的添加:在OSAL_DongheAppCooder.c和OSAL_DongheAppRouter.c文件中添加任務(wù)初始化函數(shù)和與其相對應(yīng)的事件處理函數(shù)。

(3)任務(wù)初始化及事件的處理:在DongheAppCooder.c和DongheAppRouter.c文件中對用戶任務(wù)進(jìn)行初始化,并且對與用戶任務(wù)相對應(yīng)的事件進(jìn)行處理,即完善事件處理函數(shù)。

7.2.1函數(shù)的聲明

函數(shù)的聲明在Cooder子目錄和Router子目錄是不同的,Cooder子目錄中函數(shù)的聲明是在OSAL_DongheCooder.h文件中,Router子目錄中函數(shù)的聲明在OSAL_DongheRouter.h中。

在OSAL_DongheCooder.h文件中聲明用戶自定義的任務(wù)初始化函數(shù)和與其相對應(yīng)的事件處理函數(shù),其代碼如下:

【描述7.D.2】OSAL_DongheCooder.h

//用戶自定義協(xié)調(diào)器任務(wù)初始化函數(shù)聲明

voidDonghehAppCoord_Init(bytetask_id);

//與用戶自定義協(xié)調(diào)器任務(wù)相對應(yīng)的事件處理函數(shù)聲明

UINT16DongheAppCoord_ProcessEvent(bytetask_id,UINT16events);

在OSAL_DongheRouter.h文件中聲明用戶自定義的任務(wù)初始化函數(shù)和與其相對應(yīng)的事件處理函數(shù),其代碼如下:

【描述7.D.2】OSAL_DongheRouter.h

//用戶自定義路由器或終端設(shè)備任務(wù)初始化函數(shù)聲明

voidDonghehAppRouter_Init(bytetask_id);

//與用戶自定義路由器和終端設(shè)備任務(wù)相對應(yīng)的事件處理函數(shù)聲明

UINT16DongheAppRouter_ProcessEvent(bytetask_id,UINT16events);

7.2.2任務(wù)的添加

在OSAL_DongheAppCooder.c和OSAL_DongheAppRouter.c文件中分別添加協(xié)調(diào)器和路由器的任務(wù)及相應(yīng)的事件處理函數(shù)。

1.協(xié)調(diào)器

代碼如下:

【描述7.D.2】OSAL_DongheAppCooder.c

//事件處理函數(shù)

constpTaskEventHandlerFntasksArr[]={

//MAC層處理函數(shù)

macEventLoop,

//網(wǎng)絡(luò)層處理函數(shù)

nwk_event_loop,

//Hal層處理函數(shù)

Hal_ProcessEvent,

//APS層處理函數(shù)

APS_event_loop,

//ZDO層處理函數(shù)

ZDApp_event_loop,

//用戶定義協(xié)調(diào)器的事件處理函數(shù)

DongheAppCoord_ProcessEvent

};

//保存當(dāng)前任務(wù)數(shù)

constuint8tasksCnt=sizeof(tasksArr)/sizeof(tasksArr[0]);

uint16*tasksEvents=NULL;

/*********************************************************************

*@fnosalInitTasks****************************************************************/

//任務(wù)初始化函數(shù)

voidosalInitTasks(void)

{

uint8taskID=0;

//為任務(wù)分配空間

tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);

osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt));

//MAC層任務(wù)初始化

macTaskInit(taskID++);

//網(wǎng)絡(luò)層任務(wù)初始化

nwk_init(taskID++);

//Hal層任務(wù)初始化

Hal_Init(taskID++);

//APS層任務(wù)初始化

APS_Init(taskID++);

//ZDO層任務(wù)初始化

ZDApp_Init(taskID++);

//用戶自定義協(xié)調(diào)器的任務(wù)初始化

DonghehAppCoord_Init(taskID++);

}

2.路由器或終端節(jié)點(diǎn)

代碼如下:

【描述7.D.2】OSAL_DongheAppRouter.c

//事件處理函數(shù)

constpTaskEventHandlerFntasksArr[]={

//MAC層處理函數(shù)

macEventLoop,

//網(wǎng)絡(luò)層處理函數(shù)

nwk_event_loop,

//Hal層處理函數(shù)

Hal_ProcessEvent,

//APS層處理函數(shù)

APS_event_loop,

//ZDO層處理函數(shù)

ZDApp_event_loop,

//用戶定義的路由器或終端設(shè)備事件處理函數(shù)

DongheAppRouter_ProcessEvent

};

//保存當(dāng)前任務(wù)數(shù)

constuint8tasksCnt=sizeof(tasksArr)/sizeof(tasksArr[0]);

uint16*tasksEvents=NULL;

/*********************************************************************

*@fnosalInitTasks

****************************************************************/

//任務(wù)初始化函數(shù)

voidosalInitTasks(void)

{

uint8taskID=0;

//為任務(wù)分配空間

tasksEvents=(uint16*)osal_mem_alloc(sizeof(uint16)*tasksCnt);

osal_memset(tasksEvents,0,(sizeof(uint16)*tasksCnt));

//MAC層任務(wù)初始化

macTaskInit(taskID++);

//網(wǎng)絡(luò)層任務(wù)初始化

nwk_init(taskID++);

//Hal層任務(wù)初始化

Hal_Init(taskID++);

//APS層任務(wù)初始化

APS_Init(taskID++);

//ZDO層任務(wù)初始化

ZDApp_Init(taskID++);

//用戶定義的路由器或終端設(shè)備任務(wù)初始化

DonghehAppRouter_Init(taskID++);

}

7.2.3任務(wù)初始化及事件處理

協(xié)調(diào)器和路由器的任務(wù)初始化和事件處理函數(shù)是不相同的,但是同一個工程中的協(xié)調(diào)器與路由器或終端設(shè)備通信時,必須保證它們在AF層注冊的應(yīng)用對象端點(diǎn)是相同的。有關(guān)端點(diǎn)描述符以及端點(diǎn)的簡單描述符的各成員在DongheApp.h中進(jìn)行定義,其代碼如下:

【描述7.D.2】DongheApp.h

#ifndef_DhApp_H_

#define_DhApp_H_

#include"hal_types.h"

/**************端點(diǎn)描述符成員定義***************/

#defineMySendtest_ENDPOINT 16

#defineMySendtest_PROFID 0x0F08

#defineMySendtest_DEVICEID 0x0001

#defineMySendtest_DEVICE_VERSION 0

#defineMySendtest_FLAGS 0

#defineMySendtest_MAX_INCLUSTERS 4

#defineMySendtest_MAX_OUTCLUSTERS 4

/**************端點(diǎn)描述符成員定義***************/

/******************簇ID定義*********************/

#defineMySendtest_PERIODIC_CLUSTERID 1

#defineMySendtest_GUANG_CLUSTERID 2

#defineMySendtest_WENDU_CLUSTERID 3

#defineMySendtest_SHIDU_CLUSTERID 4

#defineMySendtest_SINGLE_CLUSTERID 1

#defineMySendtest_REGUANG_CLUSTERID 2

#defineMySendtest_REWENDU_CLUSTERID 3

#defineMySendtest_RESHIDU_CLUSTERID 4

#endif

然后,在DongheAppCooder.c和DongheAppRouter.c文件中分別添加協(xié)調(diào)器和路由器的任務(wù)及相應(yīng)的事件處理函數(shù)。

1.協(xié)調(diào)器

代碼如下:

【描述7.D.2】DongheAppCooder.c

#include<string.h>

#include"DongheApp.h"

#include"OSAL_DongheCooder.h"

#include"hal_led.h"

#include"OnBoard.h"

#include"hal_key.h"

#include"hal_uart.h"

#include"OSAL.h"

#include"AF.h"

#include"ZDApp.h"

#include"ZDObject.h"

#include"ZDProfile.h"

#include"DebugTrace.h"

//定義變量,用于保存任務(wù)ID

byteDhAppCoordManage_TaskID;

//傳輸序列號

uint8DhAppCoordManage_TransID=0;

//串口端口

#defineSERIAL_APP_PORT0

//定義廣播地址信息結(jié)構(gòu)體,將在初始化函數(shù)中賦值

afAddrType_tMySendtest_Periodic_DstAddr;

//定義任務(wù)的端點(diǎn)描述符,將在初始化函數(shù)中為它賦值,然后將它注冊到應(yīng)用程序框架中

endPointDesc_tMySendtest_epDesc;

//保存當(dāng)前節(jié)點(diǎn)的網(wǎng)絡(luò)狀態(tài),初始化為未加入網(wǎng)

devStates_tDhAppCoordManage_NwkState=DEV_INIT;

/*************************函數(shù)聲明**********************************/

//網(wǎng)絡(luò)狀態(tài)改變處理函數(shù)聲明

voidDhAppCoordManage_ProcessZDOStateChange(void);

//接收信息事件處理函數(shù)聲明

voidDhAppCoordManage_ProcessMSGData(afIncomingMSGPacket_t*msg);

//按鍵改變事件處理函數(shù)聲明

voidDhAppCoordManage_HandleKeys(bytekeys);

/*************************函數(shù)聲明**********************************/

//定義數(shù)組,保存輸出簇

ID列表

constuint16MySendtest_OUTClusterList[MySendtest_MAX_OUTCLUSTERS]=

{

MySendtest_PERIODIC_CLUSTERID,

MySendtest_GUANG_CLUSTERID,

MySendtest_WENDU_CLUSTERID,

MySendtest_SHIDU_CLUSTERID

};

//定義數(shù)組,保存輸入簇ID列表

constuint16MySendtest_INClusterList[MySendtest_MAX_INCLUSTERS]=

{

MySendtest_SINGLE_CLUSTERID,

MySendtest_REGUANG_CLUSTERID,

MySendtest_REWENDU_CLUSTERID,

MySendtest_RESHIDU_CLUSTERID

};

//定義簡單描述符,它保存了任務(wù)的一些基本信息

constSimpleDescriptionFormat_tMySendtest_SimpleDesc=

{

MySendtest_ENDPOINT,

MySendtest_PROFID,

MySendtest_DEVICEID,

MySendtest_DEVICE_VERSION,

MySendtest_FLAGS,

MySendtest_MAX_INCLUSTERS,

(uint16*)MySendtest_INClusterList,

MySendtest_MAX_OUTCLUSTERS,

(uint16*)MySendtest_OUTClusterList

};

//接收串口數(shù)據(jù)的回調(diào)函數(shù)

staticvoidSerialApp_CallBack(uint8port,uint8event)

{

uint8sBuf[10]={0};

uint16nLen=0;

if(event!=HAL_UART_TX_EMPTY)

{

nLen=HalUARTRead(SERIAL_APP_PORT,sBuf,10);

if(nLen>0)

{

}

}

}

//初始化串口

staticvoidInitUart(void)

{

halUARTCfg_tuartConfig;

uartConfig.configured =TRUE;

uartConfig.baudRate =HAL_UART_BR_38400;

uartConfig.flowControl =FALSE;

uartConfig.flowControlThreshold =64;

uartConfig.rx.maxBufSize =128;

uartConfig.tx.maxBufSize =128;

uartConfig.idleTimeout =6;

uartCEnable =TRUE;

uartConfig.callBackFunc =SerialApp_CallBack;

HalUARTOpen(SERIAL_APP_PORT,&uartConfig);

}

voidDonghehAppCoord_Init(bytetask_id)

{

//將任務(wù)ID賦予DhAppCoordManage_TaskID

DhAppCoordManage_TaskID=task_id;

/************************設(shè)置廣播模式信息***********************/

//設(shè)置廣播地址模式

MySendtest_Periodic_DstAddr.addrMode=afAddrBroadcast;

//設(shè)置端點(diǎn)號

MySendtest_Periodic_DstAddr.endPoint=MySendtest_ENDPOINT;

//設(shè)置廣播地址目的地址短地址,默認(rèn)值

MySendtest_Periodic_DstAddr.addr.shortAddr=0xffff;

/**************************設(shè)置廣播模式信息**********************/

/************************設(shè)置端點(diǎn)號為16的描述符配置************/

//端點(diǎn)描述符端點(diǎn)配置

MySendtest_epDesc.endPoint=MySendtest_ENDPOINT;

//端點(diǎn)描述符任務(wù)配置

MySendtest_epDesc.task_id=&DhAppCoordManage_TaskID;

//端點(diǎn)描述符的簡單描述符

MySendtest_epDesc.simpleDesc=

(SimpleDescriptionFormat_t*)&MySendtest_SimpleDesc;

MySendtest_epDesc.latencyReq=noLatencyReqs;

/************************設(shè)置端點(diǎn)號為16的描述符配置************/

//在AF層注冊應(yīng)用對象

afRegister(&MySendtest_epDesc);

//注冊按鍵事件

RegisterForKeys(DhAppCoordManage_TaskID);

//初始化串口

InitUart();

}

//**********************************************************

UINT16DongheAppCoord_ProcessEvent(bytetask_id,UINT16events)

{

//定義指向消息結(jié)構(gòu)體的指針,并初始化為NULL

afIncomingMSGPacket_t*MSGpkt=NULL;

//事件是系統(tǒng)消息事件,當(dāng)一個消息被發(fā)送給任務(wù)時,SYS_EVENT_MSG事件

//會被傳遞給任務(wù)

if(events&SYS_EVENT_MSG)

{

//從消息隊列中取出消息

MSGpkt=

(afIncomingMSGPacket_t*)osal_msg_receive(DhAppCoordManage_TaskID);

//判斷有消息時

while(MSGpkt)

{

//將消息事件提取出來

switch(MSGpkt->hdr.event)

{

//網(wǎng)絡(luò)狀態(tài)改變事件

caseZDO_STATE_CHANGE:

//判斷設(shè)備類型

DhAppCoordManage_NwkState=(devStates_t)MSGpkt->hdr.status;

//如果設(shè)備是協(xié)調(diào)器設(shè)備

if(DhAppCoordManage_NwkState==DEV_ZB_COORD)

{

//調(diào)用網(wǎng)絡(luò)狀態(tài)處理函數(shù)

DhAppCoordManage_ProcessZDOStateChange();

}

break;

//模塊接收到數(shù)據(jù)信息事件

caseAF_INCOMING_MSG_CMD:

//如果有消息,將調(diào)用接收信息處理函數(shù)

DhAppCoordManage_ProcessMSGData(MSGpkt);

break;

//按鍵事件

caseKEY_CHANGE:

//如果有按鍵事件發(fā)生,按鍵改變事件處理

DhAppCoordManage_HandleKeys(((keyChange_t*)MSGpkt)->keys);

break;

default:

break;

}

//釋放消息所在的消息緩沖區(qū)

osal_msg_deallocate((uint8*)MSGpkt);

//等待下一個消息的到來

MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(DhAppCoordManage_TaskID);

}

//處理未完成的系統(tǒng)消息事件

return(events^SYS_EVENT_MSG);

}

return0;

}

//處理網(wǎng)絡(luò)狀態(tài)改變

voidDhAppCoordManage_ProcessZDOStateChange(void)

{

}

//處理按鍵

voidDhAppCoordManage_HandleKeys(bytekeys)

{

//按鍵SW1按下

if(keys&HAL_KEY_SW_1)

{

}

//按鍵SW2按下

if(keys&HAL_KEY_SW_2)

{

}

//按鍵SW3按下

if(keys&HAL_KEY_SW_3)

{

}

//按鍵SW4按下

if(keys&HAL_KEY_SW_4)

{

}

//按鍵SW5按下

if(keys&HAL_KEY_SW_5)

{

}

//按鍵SW6按下

if(keys&HAL_KEY_SW_6)

{

}

}

//處理接收到的數(shù)據(jù)

voidDhAppCoordManage_ProcessMSGData(afIncomingMSGPacket_t*msg)

{

switch(msg->clusterId)

{

caseMySendtest_REWENDU_CLUSTERID:

break;

caseMySendtest_SINGLE_CLUSTERID:

break;

caseMySendtest_REGUANG_CLUSTERID

break;

caseMySendtest_RESHIDU_CLUSTERID

break;

default:break;

}

}

2.路由器或終端節(jié)點(diǎn)

在DongheAppRouter.c文件中添加用戶定義的路由器或終端節(jié)點(diǎn)的任務(wù)初始化和與其相對應(yīng)的事件處理。DongheAppRouter.c文件中的程序與DongheAppCooder.c文件中的程序的主要區(qū)別表現(xiàn)在以下幾個方面:

定義任務(wù)ID變量的名稱不同。

簡單描述符的輸入簇和輸出簇不同。

網(wǎng)絡(luò)啟動時,啟動設(shè)備的類型不同。

DongheAppRouter.C文件中的程序代碼如下:

【描述7.D.2】DongheAppRouter.c

#include"OSAL_DongheRouter.h"

#include"DongheApp.h"

#include"hal_led.h"

#include"OnBoard.h"

#include"hal_key.h"

#include"hal_lcd.h"

#include"OSAL.h"

#include"AF.h"

#include"ZDApp.h"

#include"ZDObject.h"

#include"ZDProfile.h"

#include"DebugTrace.h"

//保存定義任務(wù)ID的變量

byteDhAppRouterManage_TaskID;

//數(shù)據(jù)傳輸序列號ID

uint8DhAppRouterManage_TransID=0;

//數(shù)據(jù)傳輸?shù)刂方Y(jié)構(gòu)體,在初始化中賦值

afAddrType_tMySendtest_Single_DstAddr;

//端點(diǎn)描述符結(jié)構(gòu)體,在初始化中賦值

endPointDesc_tMySendtest_epDesc;

//保存了當(dāng)前節(jié)點(diǎn)的網(wǎng)絡(luò)狀態(tài),初始化為未加入網(wǎng)

devStates_tDhAppRouterManage_NwkState=DEV_INIT;

/********************函數(shù)聲明****************************************/

//網(wǎng)絡(luò)狀態(tài)改變事件處理函數(shù)聲明

voidDhAppRouterManage_ProcessZDOStateChange(void);

//接收信息事件處理函數(shù)聲明

voidDhAppRouterManage_ProcessMSGData(afIncomingMSGPacket_t*msg);

//按鍵事件處理函數(shù)聲明

voidDhAppRouterManage_HandleKeys(bytekeys);

/*********************函數(shù)聲明**************************************/

//輸入簇列表,為路由器或終端設(shè)備輸入簇列表

constuint16MySendtest_INClusterList[MySendtest_MAX_OUTCLUSTERS]=

{MySendtest_PERIODIC_CLUSTERID,

MySendtest_GUANG_CLUSTERID,

MySendtest_WENDU_CLUSTERID,

MySendtest_SHIDU_CLUSTERID

};

//輸出簇列表,為路由器或終端設(shè)備的輸出簇列表

constuint16MySendtest_OUTClusterList[MySendtest_MAX_INCLUSTERS]=

{

MySendtest_SINGLE_CLUSTERID,

MySendtest_REGUANG_CLUSTERID,

MySendtest_REWENDU_CLUSTERID,

MySendtest_RESHIDU_CLUSTERID

};

//任務(wù)的簡單描述符,它保存了任務(wù)的一些基本信息,各成員在DongheApp.h中定義

constSimpleDescriptionFormat_tMySendtest_SimpleDesc=

{

MySendtest_ENDPOINT,

MySendtest_PROFID,

MySendtest_DEVICEID,

MySendtest_DEVICE_VERSION,

MySendtest_FLAGS,

MySendtest_MAX_INCLUSTERS,

(uint16*)MySendtest_INClusterList,

MySendtest_MAX_OUTCLUSTERS,

(uint16*)MySendtest_OUTClusterList

};

//任務(wù)初始化

voidDonghehAppRouter_Init(bytetask_id)

{

//將任務(wù)ID號賦予DhAppRouterManage_TaskID

DhAppRouterManage_TaskID=task_id;

/************************設(shè)置廣播模式信息***********************/

//設(shè)置單播信息

MySendtest_Single_DstAddr.addrMode=afAddr16Bit;

//設(shè)置端點(diǎn)號

MySendtest_Single_DstAddr.endPoint=MySendtest_ENDPOINT;

//目的地址的短地址,協(xié)調(diào)器默認(rèn)短地址為0x0000

MySendtest_Single_DstAddr.addr.shortAddr=0x0000;

/************************設(shè)置廣播模式信息***********************/

/************************設(shè)置端點(diǎn)號為16的描述符配置************/

//端點(diǎn)描述符端點(diǎn)配置

MySendtest_epDesc.endPoint=MySendtest_ENDPOINT;

//端點(diǎn)描述符任務(wù)配置

MySendtest_epDesc.task_id=&DhAppRouterManage_TaskID;

//端點(diǎn)描述符的簡單描述符

MySendtest_epDesc.simpleDesc=

(SimpleDescriptionFormat_t*)&MySendtest_SimpleDesc;

MySendtest_epDesc.latencyReq=noLatencyReqs;

/************************設(shè)置端點(diǎn)號為16的描述符配置************/

//在AF層注冊應(yīng)用對象

afRegister(&MySendtest_epDesc);

//注冊按鍵

RegisterForKeys(DhAppRouterManage_TaskID);

}

//**********************************************************

UINT16DongheAppRouter_ProcessEvent(bytetask_id,UINT16events)

{

//定義指向消息結(jié)構(gòu)體的指針

afIncomingMSGPacket_t*MSGpkt=NULL;

//事件是系統(tǒng)消息事件,當(dāng)一個消息被發(fā)送給任務(wù)時,SYS_EVENT_MSG事件

//會被傳遞給任務(wù)

if(events&SYS_EVENT_MSG)

{

//從消息隊列中取出消息

MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(DhAppRouterManage_TaskID);

//判斷有消息時

while(MSGpkt)

{

//將消息事件提取出來

switch(MSGpkt->hdr.event)

{

//如果是網(wǎng)絡(luò)狀態(tài)改變事件

caseZDO_STATE_CHANGE:

DhAppRouterManage_NwkState=(devStates_t)MSGpkt->hdr.status;

//判斷啟動的是路由器設(shè)備還是終端設(shè)備

if(DhAppRouterManage_NwkState==DEV_ROUTER

||DhAppRouterManage_NwkState==DEV_END_DEVICE)

{

//調(diào)用網(wǎng)絡(luò)狀態(tài)改變處理函數(shù)

DhAppRouterManage_ProcessZDOStateChange();

}

break;

//模塊接收到數(shù)據(jù)信息事件

caseAF_INCOMING_MSG_CMD:

//調(diào)用接收消息事件處理函數(shù)

DhAppRouterManage_ProcessMSGData(MSGpkt);

break;

//按鍵事件

caseKEY_CHANGE:

//調(diào)用按鍵事件處理函數(shù)

DhAppRouterManage_HandleKeys(((keyChange_t*)MSGpkt)->keys);

break;

default:

break;

}

//釋放消息所在的消息緩沖區(qū)

osal_msg_deallocate((uint8*)MSGpkt);

//等待接收下一個消息

MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(DhAppRouterManage_TaskID);

}

//返回還沒有處理完的系統(tǒng)消息事件

return(events^SYS_EVENT_MSG);

}

return0;

}

//處理網(wǎng)絡(luò)狀態(tài)改變

voidDhAppRouterManage_ProcessZDOStateChange(void)

{

}

//處理按鍵

voidDhAppRouterManage_HandleKeys(bytekeys)

{

//如果按鍵SW1按下

if(keys&HAL_KEY_SW_1)

{

}

//如果按鍵SW2按下

if(keys&HAL_KEY_SW_2)

{

}

//如果按鍵SW3按下

if(keys&HAL_KEY_SW_3)

{

}

//如果按鍵SW4按下

if(keys&HAL_KEY_SW_4)

{

}

//如果按鍵SW5按下

if(keys&HAL_KEY_SW_5)

{

}

//如果按鍵SW6按下

if(keys&HAL_KEY_SW_6)

{

}

}

//處理接收到的數(shù)據(jù)

voidDhAppRouterManage_ProcessMSGData(afIncomingMSGPacket_t*msg)

{

switch(msg->clusterId)

{

caseMySendtest_PERIODIC_CLUSTERID:

break;

caseMySendtest_GUANG_CLUSTERID:

break;

caseMySendtest_WENDU_CLUSTERID:

break;

caseMySendtest_SHIDU_CLUSTERID:

break;

default:break;

}

}其中,需要注意的是,協(xié)調(diào)器中的輸出簇必須對應(yīng)路由器中的輸入簇,協(xié)調(diào)器中的輸入簇必須對應(yīng)路由器中的輸出簇。

由于TI官方的Zstack協(xié)議棧的一些硬件定義不一定適用于用戶開發(fā)的CC2530開發(fā)板。為了使TI官方的Zstack協(xié)議與用戶的開發(fā)板配合適用,就需要將用戶開發(fā)板的一些硬件資源移植到Zstack協(xié)議棧中。下面將講解與本書配套的“Zigbee開發(fā)套件”硬件資源的移植,包括LED、按鍵和LCD。7.3移植

7.3.1LED移植

TI官方的Zstack協(xié)議棧中定義了LED1、LED2和LED3,而與本書配套的“Zigbee開發(fā)套件”開發(fā)板上定義了四個LED,即LED1、LED2、LED3和LED4,分別接CC2530的P1.0~P1.3,其電路原理圖如圖7-18所示,因此需要將“Zigbee開發(fā)套件”的LED移植到協(xié)議棧中。下述內(nèi)容將實(shí)現(xiàn)任務(wù)描述7.D.3,在7.D.2的基礎(chǔ)上進(jìn)行LED的移植。

LED的移植需要以下幾個步驟:

(1)

LED的基本配置,即配置LED的I/O口。

(2)

LED的狀態(tài)配置,即配置LED的打開、關(guān)閉或狀態(tài)改變。

(3)

I/O的初始化,對LED的I/O口進(jìn)行初始化。

圖7-18LED電路原理圖

1.

LED的基本配置

LED的定義在Zstack協(xié)議棧HAL

Target

CC2530EB

Config

hal_board_cfg.h文件中,如圖7-19所示。

hal_board_cfg.h文件為LED等硬件資源的配置文件,LED的移植首先要對四個LED進(jìn)行配置定義,在Zstack協(xié)議棧中LED配置的基本格式(以LED1為例)如下:圖7-19hal_board_cfg.h文件

【描述7.D.3】LED的基本配置

//定義LED1_BV為1<<(0)

#defineLED1_BVBV(0)

//LED1_SBIT為P1_0

#defineLED1_SBITP1_0

//寄存器P1DIR定義

#defineLED1_DDRP1DIR

//LED輸入/輸出為高/低定義

#defineLED1_POLARITYACTIVE_HIGH

TI官方定義的3個LED,分別接CC2530的P1_0、P1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論