{
msgPtr = (osal_event_hdr_t *)osal_msg_allocate( bufLen ); if ( msgPtr ) {
msgPtr->event = ZDO_STATE_CHANGE; // Command ID msgPtr->status = (byte)state;
osal_msg_send( *(epDesc->epDesc->task_id), (byte *)msgPtr ); } }
epDesc = epDesc->nextDesc; } }
在这个函数中设置了事件ZDO_STATE_CHANGE也就是状态变化事件,这样整个的流程就到了用户的事件处理函数中,在很多的例子中我们都可以看到这个事件的处理,也是网络建立成功后,或者加入网络成功后,首先要做的事件处理过程。
2. 如果协调器没有预编译NV_RESTORE,networkStateNV
==ZDO_INITDEV_NEW_NETWORK_STATE,但由于协调器编译了ZDO_COORDINATOR而没有编译SOFT_START,因此ZDAppDetermineDeviceType()不起作用.因此
ZDO_Config_Node_Descriptor.LogicalType和devStartMode这两个关键参数保持初始化时的值:
ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR,devStartMode = MODE_HARD。
uint8 ZDOInitDevice( uint16 startDelay ) {
uint8 networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; uint16 extendedDelay = 0;
devState = DEV_INIT; // Remove the Hold state // Initialize leave control logic ZDApp_LeaveCtrlInit();
// Check leave control reset settings
ZDApp_LeaveCtrlStartup( &devState, &startDelay ); // Leave may make the hold state come back if ( devState == DEV_HOLD )
return ( ZDO_INITDEV_LEAVE_NOT_STARTED ); // Don't join - (one time). #if defined ( NV_RESTORE )
// Get Keypad directly to see if a reset nv is needed.
// Hold down the SW_BYPASS_NV key (defined in OnBoard.h) // while booting to skip past NV Restore. if ( HalKeyRead() == SW_BYPASS_NV )
networkStateNV = ZDO_INITDEV_NEW_NETWORK_STATE; else {
// Determine if NV should be restored
networkStateNV = ZDApp_ReadNetworkRestoreState(); }
if ( networkStateNV == ZDO_INITDEV_RESTORED_NETWORK_STATE ) {
networkStateNV = ZDApp_RestoreNetworkState(); } else {
// Wipe out the network state in NV NLME_InitNV();
NLME_SetDefaultNV(); }
#endif
if ( networkStateNV == ZDO_INITDEV_NEW_NETWORK_STATE ) {
ZDAppDetermineDeviceType();//当没有定义NV_RESTORE,SOFT_START,时这个不起作用
// Only delay if joining network - not restoring network state extendedDelay = (uint16)((NWK_START_DELAY + startDelay) + (osal_rand() & EXTENDED_JOINING_RANDOM_MASK)); }
// Initialize device security
ZDApp_SecInit( networkStateNV ); // Trigger the network start
ZDApp_NetworkInit( extendedDelay ); return ( networkStateNV ); }
其余部分和定义了NV_RESTORE选项类似.