版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)新保安服務(wù)合同解讀
- 長期信用借款保證書模版
- 教師與家長攜手承諾發(fā)展
- 鏈家改進(jìn)版房屋買賣協(xié)議
- 版供水工程勞務(wù)分包合同
- 文明停車維護(hù)市容的使命
- 葡萄購銷合同模板
- 景觀石料購買協(xié)議
- 招標(biāo)信息酒店建設(shè)項目
- 啤酒花購銷合約
- UI設(shè)計·形考任務(wù)一
- 天津理工大學(xué)數(shù)據(jù)結(jié)構(gòu)實(shí)驗報告4
- 雷達(dá)原理與系統(tǒng)-雷達(dá)系統(tǒng)設(shè)計與實(shí)驗
- 充電樁工程施工組織設(shè)計施工組織
- 起訴狀(淘寶虛假交易)
- 論文《后疫情時代信息技術(shù)與幼兒園教育深度融合的策略研究》
- 2023-2024學(xué)年江西省南昌市數(shù)學(xué)六年級第一學(xué)期期末復(fù)習(xí)檢測模擬試題含答案
- 潛力評估表格
- 化工設(shè)計習(xí)題及答案
- 提高急性腦梗死的再灌注率PDCA
- 《孫悟空大鬧蟠桃會大鬧天宮》-課件
評論
0/150
提交評論