SampleApp工程詳解_第1頁
SampleApp工程詳解_第2頁
SampleApp工程詳解_第3頁
SampleApp工程詳解_第4頁
SampleApp工程詳解_第5頁
免費預覽已結束,剩余3頁可下載查看

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、#ifdefined(BUILD_ALL_DEVICES)/TheDemotargetissetuptohaveBUILD_ALL_DEVICESandHOLD_AUTO_START/Wearelookingatajumper(definedinSampleAppHw.c)tobejumpered/together-iftheyare-wewillstartupacoordinator.Otherwise,/thedevicewillstartasarouter.if(readCoordinatorJumper()/根據 P02 和 P03 是否有跳線來判斷是協調器還是路由器zgDeviceL

2、ogicalType=ZG_DEVICETYPE_COORDINATOR;elsezgDeviceLogicalType=ZG_DEVICETYPE_ROUTER;#endif/BUILD_ALL_DEVICES#ifdefined(HOLD_AUTO_START)/HOLD_AUTO_STARTisacompileoptionthatwillsurpressZDApp/fromstartingthedeviceandwaitfortheapplicationto該 project 實現了按鍵發送的功能。同時實現了信息的廣播和組播:SampleApp_SendPeriodicMessage(v

3、oid);/階段發送,廣播形式SampleApp_SendFlashMessage();/閃爍發送,組播形式同時按鍵 up 鍵可以進行控制信息的發送,即控制 Group1 中所有設備的 LED1 燈的閃爍時間按鍵 right 鍵進行設備加入/退出 Group1 的切換。由于在 SampleApp_Init(uint8task_id)中添加了 SampleApp_Init(taskID);(最后一個任務)在操作系統啟動的過程中,調用 SampleApp_Init(uint8task_id)調用順序:main(void)-osal_init_system();-osalInitTasks()-Sa

4、mpleApp_Init(taskID);voidSampleApp_Init(SampleApp_TaskIDSampleApp_NwkStateSampleApp_TransIDuint8task_id)task_id;=DEV_INIT;0;/Devicehardware/Ifthehardware/Ifthehardwareinitializationisapplicationisotherpartscanbeaddedspecific-addofthedevicehereorinmain()ithere.additinmain().(Zmain.c)./startthedevice.

5、ZDOInitDevice(0);/開始啟動設備,協調器建立網絡此時 LED3 閃爍,別的設備加入網絡,加入后 LED3 一直亮著,說明加入成功#endif/Setupfortheperiodicmessagesdestinationaddress/這兒設置了組播和廣播的短地址以及填寫了端點號/BroadcasttoeveryoneSampleApp_Periodic_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Peri

6、odic_DstAddr.addr.shortAddr=0 xFFFF;/Setupfortheflashcommandsdestinationaddress-Group1SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.addr.shortAddr=SAMPLEAPP_FLASH_GROUP;/Fillouttheendpointdescription.SampleApp_e

7、pDesc.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_epDesc.task_id=&SampleApp_TaskID;SampleApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;SampleApp_epDesc.latencyReq=noLatencyReqs;/RegistertheendpointdescriptionwiththeAFafRegister(&SampleApp_epDesc);/將填寫好的端點向 AF 層進行注冊,以便收到符合的消息時可以送到

8、應用層/Registerforallkeyevents-ThisappwillhandleallkeyeventsRegisterForKeys(SampleApp_TaskID);/注冊所有的按鍵信息,由 SampleApp_TaskID 對應的 SampleApp_ProcessEvent()進行處理/Bydefault,alldevicesstartoutinGroup1/這兒填寫的組的內容,如組名,組標識,然后力口入SAMPLEAPP_ENDPOINT 組中SampleApp_Group.ID=0 x0001;osal_memcpy(SampleApp_G,Group

9、1,7);aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);#ifdefined(LCD_SUPPORTED)HalLcdWriteString(SampleApp,HAL_LCD_LINE_1);#endif這樣的初始工作就已經完成了,接下來的就是分析按鍵事件及響應過程了首先當網絡形成時,下層會向應用層發送消息 ZDO_STATE_CHANGE 它由 SampleApp_ProcessEvent()進行處理caseZDO_STATE_CHANGE:SampleApp_NwkState=(devStates_t)(MSGpkt-hdr.stat

10、us);if(SampleApp_NwkState=DEV_ZB_COORD)|(SampleApp_NwkState=DEV_ROUTER)|(SampleApp_NwkState=DEV_END_DEVICE)/Startsendingtheperiodicmessageinaregularinterval.osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);else/Deviceisnolongerinthenetworkbreak

11、;可以看出它啟動了一個定時器,每次時間到時會觸發 SAMPLEAPP_SEND_PERIODIC_MSG_EVT 事件,它由 SampleApp_ProcessEvent()進行處理if(events&SAMPLEAPP_SEND_PERIODIC_MSG_EVT)/SendtheperiodicmessageSampleApp_SendPeriodicMessage();/發送廣播信息/Setuptosendmessageagaininnormalperiod(+alittlejitter)osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_

12、PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+(osal_rand()&0 x00FF);/returnunprocessedeventsreturn(eventsASAMPLEAPP_SEND_PERIODIC_MSG_EVT);我們可以看出,在發送廣播信息后又設置了同樣的定時器,從而循環的發送。當有案件時,由于對按鍵進行了注冊,所以由 SampleApp_ProcessEvent()進行處理caseKEY_CHANGE:SampleApp_HandleKeys(keyChange_t*)MSGpkt)-state,SGpkt)-

13、keys);/進行本函數進行處理 break;voidSampleApp_HandleKeys(uint8shift,uint8keys)(void)shift;/Intentionallyunreferencedparameterif(keys&HAL_KEY_SW_1SampleApp_SendFlashMessage(信息if(keys&HAL_KEY_SW_2/*TheFlashrCommandissenttoGroup1.*Thiskeytogglesthisdeviceinandoutofgroup1.*Ifthisdevicedoesntbelongtogroup1,thisap

14、plication*willnotreceivetheFlashcommandsenttogroup1.*/aps_Group_t*grp;grp=aps_FindGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);/若已經加入組中,則退出組,若沒有加入則加入if(grp)/Removefromthegroupaps_RemoveGroup(SAMPLEAPP_ENDPOINT,SAMPLEAPP_FLASH_GROUP);/(該函數的源碼不公開,只公布接口)else/Addtotheflashgroupaps_AddGroup(SAMPLEAPP_

15、ENDPOINT,&SampleApp_Group);再看 SampleApp_SendFlashMessage 函數voidSampleApp_SendFlashMessage(uint16flashTime)/主要調用 AF_DataRequest()函數發送uint8buffer3;buffer0=(uint8)(SampleAppFlashCounter+);(keyChange_t*)MSAMPLEAPPFLASHDURATION);/發送閃爍控制buffer1=LO_UINT16(flashTime);buffer2=HI_UINT16(flashTime);if(AF_DataR

16、equest(&SampleApp_Flash_DstAddr,&SampleApp_epDesc,SAMPLEAPP_FLASH_CLUSTERID,3,buffer,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS)=afStatus_SUCCESS)else/Erroroccurredinrequesttosend.別的設備在接受到后,仍然由 SampleApp_ProcessEvent()進行處理caseAF_INCOMING_MSG_CMD:SampleApp_MessageMSGCB(MSGpkt);break;可見它由 Sam

17、pleApp_MessageMSGCB(MSGpkt);處理voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt)uint16flashTime;switch(pkt-clusterId)caseSAMPLEAPP_PERIODIC_CLUSTERID:/對于收到的廣播信息,忽略break;caseSAMPLEAPP_FLASH_CLUSTERID:flashTime=BUILD_UINT16(pkt-cmd.Data1,pkt-cmd.Data2);/對接受到的組播信息,控制 LED4 即 LED1 的閃爍HalLedBlink(HAL_L

18、ED_4,4,50,(flashTime/4);break;這樣的話我們就搞清楚了其中的脈絡,總之,他就是舉了一個按鍵發送的簡單的例子,循環發送廣播信息,按 UP 發送組播信息。對接收到的廣播信息不予理睬,對收到的組播信息控制 LED1 的閃爍。同時按鍵 Right 時進行設備加入/退出組的切換。SAMPLEAPP 程序主要說明2012-05-0310:12:54|分類:zigbee|標簽:|字號大中小訂閱程序執行流程如下:ZMain.c的main()-osal.c的osal_init_system()-OSAL_SampleApp.c的osalInitTasks()之后分兩部分執行首先執行S

19、ampleApp.c的SampleApp_Init(),接著執行osal.c中的事件循環,不停的執行SampleApp_ProcessEvent(),進行應用層事件檢測兩個關鍵函數1.SampleApp_Init2.SampleApp_ProcessEvent分析如下SampleApp_initvoidSampleApp_Init(uint8task_id)/osal應用層的任務ID賦值SampleApp_TaskID=task_id;設備狀態設定為ZDO層中定義的初始化狀態SampleApp_NwkState=DEV_INIT;/定義消息IDSampleApp_TransID=0;后面的de

20、mo例子中用到這個編譯選項#ifdefined(SOFT_START)如果選擇了SOFT編譯選項,則作為協調器啟動zgDeviceLogicalType=ZG_DEVICETYPE_COORDINATOR;#endif/SOFT_START如果定義了HOLD_AUTO_START選項,則調用層的ZDOInitDevice,按照默認順序網絡中的第一個設備作為協調器,其他的設備作為子設備#ifdefined(HOLD_AUTO_START)ZDOInitDevice(0);#endif定義廣播地址地址模式SampleApp_Periodic_DstAddr.addrMode=(afAddrMode

21、_t)AddrBroadcast;指定端點號SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT/指定目的網絡地址為廣播地址SampleApp_Periodic_DstAddr.addr.shortAddr=0 xFFFF;/設定flash中命令即按鍵命令要發送的目的地址SampleApp_Flash_DstAddr.addrMode=(afAddrMode_t)afAddrGroup;SampleApp_Flash_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;SampleApp_Flash_DstAddr.a

22、ddr.shortAddr=SAMPLEAPP_FLASH_GROUP;/定義本設備用來通信的APS層端點描述符/端點號SampleApp_epDesc.endPoint=SAMPLEAPP_ENDPOINT;/任務IDSampleApp_epDesc.task_id=&SampleApp_TaskID;簡單描述符SampleApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&SampleApp_SimpleDesc;延時策略SampleApp_epDesc.latencyReq=noLatencyReqs;/向AF層注冊端點描述符afRegi

23、ster(&SampleApp_epDesc);/向osal層注冊按鍵消息RegisterForKeys(SampleApp_TaskID);/設定一個新的組/組號SampleApp_Group.ID=0 x0003;設定組名osal_memcpy(SampleApp_G,Group3,7);把該組添加到網絡中aps_AddGroup(SAMPLEAPP_ENDPOINT,&SampleApp_Group);#ifdefined(LCD_SUPPORTED)如果選擇了LCD_SUPPORTED編譯選項,會打印一串字符Print8(HAL_LCD_LINE_2,20,Sampl

24、eApp,1);#endif)uint16SampleApp_ProcessEvent(uint8task_id,uint16events)(定義應用層數據包afIncomingMSGPacket_t*MSGpkt;/判斷osal層的消息類型如果系統消息到來if(events&SYS_EVENT_MSG)(接收數據包MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(SampleApp_TaskID);如果數據包不為空while(MSGpkt)(判斷消息類型switch(MSGpkt-hdr.event)(/如果是按鍵消息caseKEY_CHANGE:調用按鍵處理函數SampleApp_HandleKeys(keyChange_t*)MSGpkt)-state,(keyChange_t*)MSGpkt)-keys);break;/如果是別的組設備周期發送的消息caseAF_INCOMING_MSG_CMD:調用對周期消息的處理函數SampleApp_MessageMSGCB(MSGpkt);break;/如果是設備狀態變換的命令caseZDO_STATE_CHANGE:獲取設備狀態SampleApp_NwkState=(devStates_t)(MSGpkt-hdr.st

溫馨提示

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

評論

0/150

提交評論