SimpleApp程序中的部分代码说明.docx
- 文档编号:23947792
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:14
- 大小:110.24KB
SimpleApp程序中的部分代码说明.docx
《SimpleApp程序中的部分代码说明.docx》由会员分享,可在线阅读,更多相关《SimpleApp程序中的部分代码说明.docx(14页珍藏版)》请在冰豆网上搜索。
SimpleApp程序中的部分代码说明
SimpleApp程序中的部分代码说明(2010-12-0620:
01)
分类:
ZigBee技术学习
在TI给的例子中,有两个大部分是用户必须编写,一个就是初始化函数,一个就是不同事件的处理函数,下面是SampleApp程序中的远程开头控制的初始化函数。
voidSAPI_Init(bytetask_id)
{
uint8startOptions;
//初始化任务ID,其中task_id由操作系统任务函数osalInitTasks(void)中的SAPI_Init(taskID);初始化
sapi_TaskID=task_id;
//初始化绑定标志位,默认不允许绑定
sapi_bindInProgress=0xffff;
//初始化端点描述符,分别是:
端点任务ID号,端点号,简单描述符和延时请求,其中简单描述符有用户自己定义。
sapi_epDesc.endPoint=zb_SimpleDesc.EndPoint;
sapi_epDesc.task_id=&sapi_TaskID;
sapi_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&zb_SimpleDesc;
sapi_epDesc.latencyReq=noLatencyReqs;
//向应用AF层注册端点描述符
//Registertheendpoint/interfacedescriptionwiththeAF
afRegister(&sapi_epDesc);
//关闭描述符匹配响应请求默认是关闭的在zb_AllowBind()函数中打开
//Turnoffmatchdescriptorresponsebydefault
afSetMatch(sapi_epDesc.simpleDesc->EndPoint,FALSE);
//RegistercallbackevetnsfromtheZDApp
//注册两个响应事件,也就是网络地址响应,描述符匹配响应
ZDO_RegisterForZDOMsg(sapi_TaskID,NWK_addr_rsp);
ZDO_RegisterForZDOMsg(sapi_TaskID,Match_Desc_rsp);
#if(definedHAL_KEY)&&(HAL_KEY==TRUE)
//RegisterforHALevents注册按键事件
RegisterForKeys(sapi_TaskID);
if(HalKeyRead()==HAL_KEY_SW_5)
{
//IfSW5ispressedandheldwhilepowerup,forceauto-startandnv-restoreoffandreset
//关闭自动启动设备
startOptions=ZCD_STARTOPT_CLEAR_STATE|ZCD_STARTOPT_CLEAR_CONFIG;
zb_WriteConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
zb_SystemReset();
}
#endif//HAL_KEY
//Setaneventtostarttheapplication设置进入事件,启动应用
osal_set_event(task_id,ZB_ENTRY_EVENT);
}
下面是事件处理函数
UINT16SAPI_ProcessEvent(bytetask_id,UINT16events)
{
osal_event_hdr_t*pMsg;
afIncomingMSGPacket_t*pMSGpkt;
afDataConfirm_t*pDataConfirm;
if(events&SYS_EVENT_MSG)//强制事件,也是系统定义好的事件,下面有很多子事件
{
pMsg=(osal_event_hdr_t*)osal_msg_receive(task_id);
while(pMsg)
{
switch(pMsg->event)
{
//消息注册并被接收后(OTA),将作为ZDO_CB_MSG(OSALMsg)发送到应用/任务
caseZDO_CB_MSG:
SAPI_ProcessZDOMsgs((zdoIncomingMsg_t*)pMsg);
break;
caseAF_DATA_CONFIRM_CMD:
//Thismessageisreceivedasaconfirmationofadatapacketsent.ThestatusisofZStatus_ttype[definedinZComDef.h]
//ThemessagefieldsaredefinedinAF.h
//数据包发送确认信息,这些状态值定义在ZcomDef.h文件中,该信息定义在AF.h中
pDataConfirm=(afDataConfirm_t*)pMsg;
//发送消息确认
SAPI_SendDataConfirm(pDataConfirm->transID,pDataConfirm->hdr.status);
break;
caseAF_INCOMING_MSG_CMD:
//AF数据输入
pMSGpkt=(afIncomingMSGPacket_t*)pMsg;
//接收数据指示
SAPI_ReceiveDataIndication(pMSGpkt->srcAddr.addr.shortAddr,pMSGpkt->clusterId,pMSGpkt->cmd.DataLength,pMSGpkt->cmd.Data);
break;
caseZDO_STATE_CHANGE:
//ZDO状态改变
//Ifthedevicehasstartedup,notifytheapplication向应用通报设备启动
if(pMsg->status==DEV_END_DEVICE||
pMsg->status==DEV_ROUTER||
pMsg->status==DEV_ZB_COORD)
{
SAPI_StartConfirm(ZB_SUCCESS);
}
elseif(pMsg->status==DEV_HOLD||
pMsg->status==DEV_INIT)
{
SAPI_StartConfirm(ZB_INIT);//启动确认
}
break;
caseZDO_MATCH_DESC_RSP_SENT:
//ZDO发送一个匹配描述符响应
SAPI_AllowBindConfirm(((ZDO_MatchDescRspSent_t*)pMsg)->nwkAddr);
break;
caseKEY_CHANGE:
//键盘事件
zb_HandleKeys(((keyChange_t*)pMsg)->state,((keyChange_t*)pMsg)->keys);
break;
caseSAPICB_DATA_CNF:
//发送数据确认
SAPI_SendDataConfirm(
(uint8)((sapi_CbackEvent_t*)pMsg)->data,
((sapi_CbackEvent_t*)pMsg)->hdr.status);
break;
caseSAPICB_BIND_CNF:
//绑定确认
SAPI_BindConfirm(
((sapi_CbackEvent_t*)pMsg)->data,
((sapi_CbackEvent_t*)pMsg)->hdr.status);
break;
caseSAPICB_START_CNF:
//设备启动确认
SAPI_StartConfirm(((sapi_CbackEvent_t*)pMsg)->hdr.status);
break;
default:
//用户信息处理
//Usermessagesshouldbehandledbyuserorpassedtotheapplication
if(pMsg->event>=ZB_USER_MSG)
{
//用户可以编写自己的消息处理任务函数
}
break;
}
//Releasethememory
osal_msg_deallocate((uint8*)pMsg);
//Next
pMsg=(osal_event_hdr_t*)osal_msg_receive(task_id);
}
//Returnunprocessedevents返回没有处理的事件
return(events^SYS_EVENT_MSG);
}
if(events&ZB_ALLOW_BIND_TIMER)//允许绑定时间事件,也就是绑定时间到,没有绑定成功时执行
{
afSetMatch(sapi_epDesc.simpleDesc->EndPoint,FALSE);
return(events^ZB_ALLOW_BIND_TIMER);
}
if(events&ZB_BIND_TIMER)//绑定时间
{
//Sendbindconfirmcallbacktoapplication
SAPI_BindConfirm(sapi_bindInProgress,ZB_TIMEOUT);
sapi_bindInProgress=0xffff;
return(events^ZB_BIND_TIMER);
}
if(events&ZB_ENTRY_EVENT)
{
uint8startOptions;
//Giveindicationtoapplicationofdevicestartup提示用户设备已经启动
zb_HandleOsalEvent(ZB_ENTRY_EVENT);
//LEDoffcancelsHOLD_AUTO_STARTblinksetinthestack点高蓝色指示灯
HalLedSet(HAL_LED_4,HAL_LED_MODE_OFF);
//从ZigBee设备的非易失性存储器中读取配置信息
zb_ReadConfiguration(ZCD_NV_STARTUP_OPTION,sizeof(uint8),&startOptions);
if(startOptions&ZCD_STARTOPT_AUTO_START)
{
zb_StartRequest();
}
else
{
//blinkledsandwaitforexternalinputtoconfigandrestart再次启动设备加入网络
HalLedBlink(HAL_LED_2,0,50,500);
}
return(events^ZB_ENTRY_EVENT);
}
//Thismustbethelasteventtobeprocessed
if(events&(ZB_USER_EVENTS))
{
//Usereventsarepassedtotheapplication处理用户自己定义的事件
zb_HandleOsalEvent(events);
//Donotreturnhere,return0later
}
//Discardunknownevents丢弃未知的事件
return0;
}
2.App任务事件处理函数
在SAPI_Init()函数最后设置了进入事件(ZB-ENTRY_EVENT)用户自己定义的,这将触发任务的事件处理函数SAPI_ProcessEvent(),该函数处理任务所有的事件,包含时间,消息和其他用户定义的事件。
事件
处理函数
系统消息事件
SYS_ENTRY_MSG
ZDO反馈
ZDO_CB_MSG
SAPI_ProcessZDOMsgs()
AF数据确认
AF_DATA_CONFIRM_CMD
SAPI_SendDataConfirm()
AF信息输入
AF_INCOMING_MSG_CMD
SAPI_ReceiveDataIndication()
ZDO状态改变
ZDO_STATE_CHANGE
SAPI_StartConfirm()
ZDO匹配描述符响应
ZDO_MATCH_DESC_RSP_SENT
SAPI_AllowBindConfirm()
按键
KEY_CHANGE
zb_HandleKeys()
发送数据确认
SAPICB_DATA_CNF
SAPI_SendDataConfirm()
绑定确认
SAPICB_BIND_CNF
SAPI_BindConfirm()
设备启动确认
SAPICB_START_CNF
SAPI_StartConfirm()
允许绑定时间事件
ZB_ALLOW_BIND_TIMER
afSetMatch()
绑定时间事件
ZB_BIND_TIMER
SAPI_BindConfirm()
进入事件
ZB_ENTRY_EVENT
zb_StartRequest()
3.ZDO初始化
voidZDApp_Init(bytetask_id)
{
uint8capabilities;
//SavethetaskID初始化任务ID,其中task_id由操作系统初始化任务函数osalInitTasks()决定
ZDAppTaskID=task_id;
//初始化网络地址,地址模式为16位,网络地址为无效
ZDAppNwkAddr.addrMode=Addr16Bit;
ZDAppNwkAddr.addr.shortAddr=INVALID_NODE_ADDR;
(void)NLME_GetExtAddr();//保存64位IEEE地址。
//Checkformanual"HoldAutoStart"检测是否阻止自动启动
ZDAppCheckForHoldKey();
//InitializeZDOitemsandsetupthedevice-typeofdevicetocreate.
//根据设备类型初始化网络服务
ZDO_Init();
//RegistertheendpointdescriptionwiththeAF
//Thistaskdoesn'thaveaSimpledescription,butwestillneed
//toregistertheendpoint.注册端点0
afRegister((endPointDesc_t*)&ZDApp_epDesc);
#ifdefined(ZDO_USERDESC_RESPONSE)
ZDApp_InitUserDesc();
#endif//ZDO_USERDESC_RESPONSE
//setbroadcastaddressmasktosupportbroadcastfiltering
NLME_GetRequest(nwkCapabilityInfo,0,&capabilities);
NLME_SetBroadcastFilter(capabilities);
//Startthedevice?
启动设备
if(devState!
=DEV_HOLD)
{
ZDOInitDevice(0);
}
else
{
//BlinkLEDtoindicateHOLD_START
HalLedBlink(HAL_LED_4,0,50,500);
}
ZDApp_RegisterCBs();//注册响应事件
}/*ZDO_Init()*/
任务事件处理函数ZDApp_event_loop()包含消息、网络初始化、网络启动、路由启动等事件。
事件
处理函数
系统消息事件
SYS_ENTRY_MSG
AF信息输入
AF_INCOMING_MSG_CMD
ZDP_IncomingData()
ZDO反馈
AF_DATA_CONFIRM_CMD
ZDApp_ProcessMsgCBs()
AF数据确认
AF_DATA_CONFIRM_CMD
无
网络发现确认
ZDO_NWK_DISC_CNF
NLME_JoinRequest()或
NLME_ReJoinRequest()
网络加入指示
ZDO_NWK_JOIN_IND
ZDApp_ProcessNetworkJoin()
网络加入请求
ZDO_NWK_JOIN_REQ
ZDApp_NetworkInit()
网络初始化
ZDO_NETWORK_INIT
ZDO_StartDevice()
网络启动
ZDO_NETWORK_START
ZDApp_NetworkStartEvt()
路由启动
ZDO_ROUTER_START
osal_pwrmgr_device()
状态改变
ZDO_STATE_CHANGE_EVT
ZDO_UpdateNwkStatus()
网络NV更新
ZDO_NWK_UPDATE_NV
ZDApp_SaveNetworkStateEvt()
设备重新启动
ZDO_DEVICE_RESET
SystemResetSoft()
在f8wCoord.cfg文件中,我们可以看到,有下面的编译选项,协调器的设置,应该是表示
#defineZDO_COORDINATOR
/*CoordinatorSettings*/
-DZDO_COORDINATOR//CoordinatorFunctions
那么在ZGlobals.h文件中可以看到下面的定义
//ValuesforZCD_NV_LOGICAL_TYPE(zgDeviceLogicalType)
#defineZG_DEVICETYPE_COORDINATOR0x00
#defineZG_DEVICETYPE_ROUTER0x01
#defineZG_DEVICETYPE_ENDDEVICE0x02
#defineZG_DEVICETYPE_SOFT0x03
//DeviceLogicalType
#ifdefined(SOFT_START)
#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_SOFT
#elifdefined(ZDO_COORDINATOR)
#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_COORDINATOR
#elifdefined(RTR_NWK)
#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_ROUTER
#else
#defineDEVICE_LOGICAL_TYPEZG_DEVICETYPE_ENDDEVICE
#endif
说明我们这里选择的是协调器,在下图中我们选择的不同的类型,下面的文件就会被不同的选择。
控制节点的IAR工程配置选项中定义了阻止自定启动,即HOLD_AUTO_START,因此在ZDApp.c文件中定义了设备初始状态和启动模式:
在uint8ZDOInitDevice(uint16startDelay)函数中
devState=DEV_HOLD
#ifdefined(ZDO_COORDINATOR)&&!
defined(SOFT_START)
//Setthedefaulttocoodinator
devStartModes_tdevStartMode=MODE_HARD;
在控制节点的NV中,默认状态下没有设置启动模式,即ZCD_NV_STARTUP_OPTION=0
因此,初次使用控制节点时不会自定启动该节点。
另外,对应控制节点的SimpleController.c定义了应用层的状态:
myAppState=APP_INIT
结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SimpleApp 程序 中的 部分 代码 说明