📄 zdapp.c
字号:
{
break;
}
}
if ( i == ResultCount )
{
msg.hdr.status = ZDO_FAIL; // couldn't find appropriate PAN to join !
}
else
{
msg.hdr.status = ZDO_SUCCESS;
msg.panIdLSB = LO_UINT16( pNwkDesc->panId );
msg.panIdMSB = HI_UINT16( pNwkDesc->panId );
msg.logicalChannel = pNwkDesc->logicalChannel;
msg.version = pNwkDesc->version;
osal_cpyExtAddr( msg.extendedPANID, pNwkDesc->extendedPANID );
}
ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_DISC_CNF, sizeof(ZDO_NetworkDiscoveryCfm_t), (byte *)&msg );
return (ZSuccess);
} // ZDO_NetworkDiscoveryConfirmCB
/*********************************************************************
* @fn ZDO_NetworkFormationConfirmCB
*
* @brief This function reports the results of the request to
* initialize a coordinator in a network.
*
* @param Status - Result of NLME_NetworkFormationRequest()
*
* @return none
*/
void ZDO_NetworkFormationConfirmCB( ZStatus_t Status )
{
#if defined(ZDO_COORDINATOR)
nwkStatus = (byte)Status;
if ( Status == ZSUCCESS )
{
// LED on shows Coordinator started
HalLedSet ( HAL_LED_3, HAL_LED_MODE_ON );
// LED off forgets HOLD_AUTO_START
HalLedSet (HAL_LED_4, HAL_LED_MODE_OFF);
#if defined ( ZBIT )
SIM_SetColor(0xd0ffd0);
#endif
if ( devState == DEV_HOLD )
{
// Began with HOLD_AUTO_START
devState = DEV_COORD_STARTING;
}
}
#if defined(BLINK_LEDS)
else
HalLedSet ( HAL_LED_3, HAL_LED_MODE_FLASH ); // Flash LED to show failure
#endif
osal_set_event( ZDAppTaskID, ZDO_NETWORK_START );
#endif //ZDO_COORDINATOR
}
#if defined(RTR_NWK)
/*********************************************************************
* @fn ZDO_StartRouterConfirmCB
*
* @brief This function reports the results of the request to
* start functioning as a router in a network.
*
* @param Status - Result of NLME_StartRouterRequest()
*
* @return none
*/
void ZDO_StartRouterConfirmCB( ZStatus_t Status )
{
nwkStatus = (byte)Status;
if ( Status == ZSUCCESS )
{
// LED on shows Router started
HalLedSet ( HAL_LED_3, HAL_LED_MODE_ON );
// LED off forgets HOLD_AUTO_START
HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF);
if ( devState == DEV_HOLD )
{
// Began with HOLD_AUTO_START
devState = DEV_END_DEVICE;
}
}
#if defined(BLINK_LEDS)
else
HalLedSet( HAL_LED_3, HAL_LED_MODE_FLASH ); // Flash LED to show failure
#endif
osal_set_event( ZDAppTaskID, ZDO_ROUTER_START );
}
#endif //RTR_NWK
/*********************************************************************
* @fn ZDO_JoinConfirmCB
*
* @brief This function allows the next hight layer to be notified
* of the results of its request to join itself or another
* device to a network.
*
* @param Status - Result of NLME_JoinRequest()
*
* @return none
*/
void ZDO_JoinConfirmCB( uint16 PanId, ZStatus_t Status )
{
nwkStatus = (byte)Status;
if ( Status == ZSUCCESS )
{
// LED on shows device joined
HalLedSet ( HAL_LED_3, HAL_LED_MODE_ON );
// LED off forgets HOLD_AUTO_START
HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF);
if ( (devState == DEV_HOLD) )
{
// Began with HOLD_AUTO_START
devState = DEV_NWK_JOINING;
}
#if ! ( SECURE != 0 )
// Notify to save info into NV
ZDApp_NVUpdate();
#endif
}
#if defined(BLINK_LEDS)
else
HalLedSet ( HAL_LED_3, HAL_LED_MODE_FLASH ); // Flash LED to show failure
#endif
// Notify ZDApp
ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_JOIN_IND, sizeof(osal_event_hdr_t), (byte*)NULL );
}
/*********************************************************************
* @fn ZDO_JoinIndicationCB
*
* @brief This function allows the next higher layer of a
* coordinator to be notified of a remote join request.
*
* @param ShortAddress - 16-bit address
* @param ExtendedAddress - IEEE (64-bit) address
* @param CapabilityInformation - Association Capability Information
*
* @return ZStatus_t
*/
#if defined(RTR_NWK)
ZStatus_t ZDO_JoinIndicationCB( uint16 ShortAddress, byte *ExtendedAddress,
byte CapabilityInformation )
{
#if defined (AUTO_SOFT_START)
ZDX_PostCoordinatorIEEE(ShortAddress);
#endif
// Notify to save info into NV
ZDApp_NVUpdate();
#if ( SECURE != 0 )
// send notification to TC of new device..
if ( _NIB.SecurityLevel )
osal_start_timerEx( ZDAppTaskID, ZDO_NEW_DEVICE, 600 );
#endif // SECURE
return ( ZSuccess );
}
#endif //RTR_NWK
/*********************************************************************
* @fn ZDO_LeaveCnf
*
* @brief This function allows the next higher layer to be
* notified of the results of its request for this or
* a child device to leave the network.
*
* @param cnf - NLME_LeaveCnf_t
*
* @return none
*/
void ZDO_LeaveCnf( NLME_LeaveCnf_t* cnf )
{
// Check for this device
if ( osal_ExtAddrEqual( cnf->extAddr,
NLME_GetExtAddr() ) == TRUE )
{
// Prepare to leave with reset
ZDApp_LeaveReset( cnf->rejoin );
}
//------------------------------------------------------------------
#if defined( RTR_NWK )
//------------------------------------------------------------------
else
{
// Remove device address(optionally descendents) from data
ZDApp_LeaveUpdate( cnf->dstAddr,
cnf->extAddr,
cnf->removeChildren );
}
//------------------------------------------------------------------
#endif
//------------------------------------------------------------------
}
/*********************************************************************
* @fn ZDO_LeaveInd
*
* @brief This function allows the next higher layer of a
* device to be notified of a remote leave request or
* indication.
*
* @param ind - NLME_LeaveInd_t
*
* @return none
*/
void ZDO_LeaveInd( NLME_LeaveInd_t* ind )
{
uint8 leave;
// Parent is requesting the leave - NWK layer filters out illegal
// requests
if ( ind->request == TRUE )
{
// Notify network of leave
//----------------------------------------------------------------
#if defined( RTR_NWK )
//----------------------------------------------------------------
NLME_LeaveRsp_t rsp;
rsp.rejoin = ind->rejoin;
rsp.removeChildren = ind->removeChildren;
NLME_LeaveRsp( &rsp );
//----------------------------------------------------------------
#endif
//----------------------------------------------------------------
// Prepare to leave with reset
ZDApp_LeaveReset( ind->rejoin );
}
else
{
leave = FALSE;
// Check if this device needs to leave as a child or descendent
if ( ind->srcAddr == NLME_GetCoordShortAddr() )
{
if ( ( ind->removeChildren == TRUE ) ||
( ZDO_Config_Node_Descriptor.LogicalType ==
NODETYPE_DEVICE ) )
{
leave = TRUE;
}
}
else if ( ind->removeChildren == TRUE )
{
// Check NWK address allocation algorithm
//leave = RTG_ANCESTOR(nwkAddr,thisAddr);
}
if ( leave == TRUE )
{
// Prepare to leave with reset
ZDApp_LeaveReset( ind->rejoin );
}
else
{
// Remove device address(optionally descendents) from data
ZDApp_LeaveUpdate( ind->srcAddr,
ind->extAddr,
ind->removeChildren );
}
}
}
/*********************************************************************
* @fn ZDO_SyncIndicationCB
*
* @brief This function allows the next higher layer of a
* coordinator to be notified of a loss of synchronization
* with the parent/child device.
*
* @param type: 0 - child; 1 - parent
*
*
* @return none
*/
void ZDO_SyncIndicationCB( byte type, uint16 shortAddr )
{
#if !defined ( RTR_NWK )
if ( type == 1 )
{
ZDApp_SendMsg( ZDAppTaskID, ZDO_NWK_JOIN_REQ, sizeof(osal_event_hdr_t), NULL );
}
#endif
return;
}
/*********************************************************************
* @fn ZDO_PollConfirmCB
*
* @brief This function allows the next higher layer to be
* notified of a Poll Confirm.
*
* @param none
*
* @return none
*/
void ZDO_PollConfirmCB( byte status )
{
return;
}
/******************************************************************************
* @fn ZDApp_NwkWriteNVRequest (stubs AddrMgrWriteNVRequest)
*
* @brief Stub routine implemented by NHLE. NHLE should call
* <AddrMgrWriteNV> when appropriate.
*
* @param none
*
* @return none
*/
void ZDApp_NwkWriteNVRequest( void )
{
if ( !osal_get_timeoutEx( ZDAppTaskID, ZDO_NWK_UPDATE_NV ) )
{
// Trigger to save info into NV
ZDApp_NVUpdate();
}
}
/*********************************************************************
* Call Back Functions from Security - API
*/
#if defined( ZDO_COORDINATOR )
/*********************************************************************
* @fn ZDO_UpdateDeviceIndication
*
* @brief This function notifies the "Trust Center" of a
* network when a device joins or leaves the network.
*
* @param extAddr - pointer to 64 bit address of new device
* @param status - 0 if a new device joined securely
* - 1 if a new device joined un-securely
* - 2 if a device left the network
*
* @return true if newly joined device should be allowed to
* remain on network
*/
ZStatus_t ZDO_UpdateDeviceIndication( byte *extAddr, byte status )
{
#if ( SECURE != 0 )
// can implement a network access policy based on the
// IEEE address of newly joining devices...
#endif // Trust Center
return ZSuccess;
}
#endif // ZDO
/*********************************************************************
* @fn ZDApp_InMsgCB
*
* @brief This function is called to pass up any message that is
* not yet supported. This allows for the developer to
* support features themselves..
*
* @return none
*/
void ZDApp_InMsgCB( zdoIncomingMsg_t *inMsg )
{
if ( inMsg->clusterID & ZDO_RESPONSE_BIT )
{
// Handle the response message
}
else
{
// Handle the request message by sending a generic "not supported".
// End Device Announce doesn't have a response.
if ( !(inMsg->wasBroadcast) && inMsg->clusterID != End_Device_annce )
{
ZDP_GenericRsp( inMsg->TransSeq, &(inMsg->srcAddr), ZDP_NOT_SUPPORTED, 0,
(uint16)(inMsg->clusterID | ZDO_RESPONSE_BIT), inMsg->SecurityUse );
}
}
}
/*********************************************************************
* @fn ZDApp_ChangeMatchDescRespPermission()
*
* @brief Changes the Match Descriptor Response permission.
*
* @param endpoint - endpoint to allow responses
* @param action - true to allow responses, false to not
*
* @return none
*/
void ZDApp_ChangeMatchDescRespPermission( uint8 endpoint, uint8 action )
{
// Store the action
afSetMatch( endpoint, action );
}
/*********************************************************************
* @fn ZDApp_NetworkInit()
*
* @brief Used to start the network joining process
*
* @param delay - mSec delay to wait before starting
*
* @return none
*/
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 );
}
}
/*********************************************************************
* @fn ZDApp_StartUpFromApp()
*
* @brief Start the device. This function will only start a device
* that is in the Holding state.
*
* @param mode - ZDAPP_STARTUP_COORD - Start up as coordinator only
* ZDAPP_STARTUP_ROUTER - Start up as router only
* ZDAPP_STARTUP_AUTO - Startup in auto, look for coord,
* if not found, become coord.
*
* @return TRUE if started, FALSE if in the wrong mode
*/
ZStatus_t ZDApp_StartUpFromApp( uint8 mode )
{
ZStatus_t ret = ZFailure;
if ( devState == DEV_HOLD )
{
// Start the device's joining process
if ( ZDOInitDevice( 0 ) == ZDO_INITDEV_NEW_N
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -