{
softStartAllowCoord = FALSE; // Don't allow coord to start continueJoining = TRUE; }
devStartMode = MODE_JOIN; // Assume joining }
#endif // SOFT_START
}
由于定义了SOFT_START编译选项,因为在按下S1按键后,把ZG_DEVICETYPE_COORDINATOR值写入了ZCD_NV_LOGICAL_TYPE条目中,在系统重新启动后,通过初始化zgDeviceLogicalType=
ZG_DEVICETYPE_COORDINATOR所以这样就作为了一个协调器进行正常的启动了。后面的启动过程和前面分析是一样的形成网络,点亮绿色的灯。调用网络的初始化函数,触发ZDAppTaskID,任务中的ZDO_NETWORK_INIT事件处理。
void ZDApp_NetworkInit( uint16 delay ) {
if ( delay ) {
// Wait awhile before starting the device
osal_start_timerEx( ZDAppTaskID, ZDO_NETWORK_INIT, delay ); } else {
osal_set_event( ZDAppTaskID, ZDO_NETWORK_INIT ); } }
UINT16 ZDApp_event_loop( byte task_id, UINT16 events ) {
if ( events & ZDO_NETWORK_INIT ) {
// Initialize apps and start the network devState = DEV_INIT;
ZDO_StartDevice( (uint8)ZDO_Config_Node_Descriptor.LogicalType, devStartMode,
DEFAULT_BEACON_ORDER, DEFAULT_SUPERFRAME_ORDER );
// Return unprocessed events
return (events ^ ZDO_NETWORK_INIT); }
}
从上面的分析可以得出ZDO_Config_Node_Descriptor.LogicalType = NODETYPE_COORDINATOR;
devStartMode = MODE_HARD;,
void ZDO_StartDevice( byte logicalType, devStartModes_t startMode, byte beaconOrder, byte superframeOrder ) {
ZStatus_t ret;
ret = ZUnsupportedMode;
#if defined(ZDO_COORDINATOR)
if ( logicalType == NODETYPE_COORDINATOR ) {
if ( startMode == MODE_HARD )
{
devState = DEV_COORD_STARTING; //调用网络的格式化函数形成网络
ret = NLME_NetworkFormationRequest( zgConfigPANID, zgDefaultChannelList,
zgDefaultStartingScanDuration, beaconOrder,
superframeOrder, false ); }
else if ( startMode == MODE_RESUME ) {
// Just start the coordinator
devState = DEV_COORD_STARTING;
ret = NLME_StartRouterRequest( beaconOrder, beaconOrder, false ); }
else {
#if defined( LCD_SUPPORTED )
HalLcdWriteScreen( %unknown\ #endif } }
#endif // !ZDO_COORDINATOR
#if !defined ( ZDO_COORDINATOR ) || defined( SOFT_START ) if ( logicalType == NODETYPE_ROUTER || logicalType == NODETYPE_DEVICE ) {
if ( (startMode == MODE_JOIN) || (startMode == MODE_REJOIN) ) {
devState = DEV_NWK_DISC;
#if defined( MANAGED_SCAN ) ZDOManagedScan_Next(); ret =
NLME_NetworkDiscoveryRequest( managedScanChannelMask, BEACON_ORDER_15_MSEC ); #else
ret = NLME_NetworkDiscoveryRequest( zgDefaultChannelList, zgDefaultStartingScanDuration ); #endif }
else if ( startMode == MODE_RESUME ) {
if ( logicalType == NODETYPE_ROUTER ) {
ZMacScanCnf_t scanCnf;
devState = DEV_NWK_ORPHAN;
/* if router and nvram is available, fake successful orphan scan
*/
scanCnf.hdr.Status = ZSUCCESS;
scanCnf.ScanType = ZMAC_ORPHAN_SCAN; scanCnf.UnscannedChannels = 0; scanCnf.ResultListSize = 0;
nwk_ScanJoiningOrphan(&scanCnf);
ret = ZSuccess; } else {
devState = DEV_NWK_ORPHAN; ret = NLME_OrphanJoinRequest( zgDefaultChannelList,
zgDefaultStartingScanDuration ); } } else {
#if defined( LCD_SUPPORTED )
HalLcdWriteScreen( \ #endif } }
#endif //!ZDO COORDINATOR || SOFT_START
if ( ret != ZSuccess )
osal_start_timerEx(ZDAppTaskID, ZDO_NETWORK_INIT, NWK_RETRY_DELAY );
}
其实路由器的判断形成过程于其极其的相似,也是这个文件,只是把按键改成了K2,也就改变了zgDeviceLogicalType变量的值。