/********************************************************************* * @fn afBuildMSGIncoming * * @brief Build the message for the app * * @param * * @return pointer to next in data buffer */ static void afBuildMSGIncoming( aps_FrameFormat_t *aff, endPointDesc_t *epDesc, zAddrType_t *SrcAddress, uint16 SrcPanId, NLDE_Signal_t *sig, uint8 nwkSeqNum, uint8 SecurityUse, uint32 timestamp, uint8 radius ) { afIncomingMSGPacket_t *MSGpkt; const uint8 len = sizeof( afIncomingMSGPacket_t ) + aff->asduLength; uint8 *asdu = aff->asdu; MSGpkt = (afIncomingMSGPacket_t *)osal_msg_allocate( len ); if ( MSGpkt == NULL ) { return; } MSGpkt->hdr.event = AF_INCOMING_MSG_CMD; MSGpkt->groupId = aff->GroupID; MSGpkt->clusterId = aff->ClusterID; afCopyAddress( &MSGpkt->srcAddr, SrcAddress ); MSGpkt->srcAddr.endPoint = aff->SrcEndPoint; MSGpkt->endPoint = epDesc->endPoint; MSGpkt->wasBroadcast = aff->wasBroadcast; MSGpkt->LinkQuality = sig->LinkQuality; MSGpkt->correlation = sig->correlation; MSGpkt->rssi = sig->rssi; MSGpkt->SecurityUse = SecurityUse; MSGpkt->timestamp = timestamp; MSGpkt->nwkSeqNum = nwkSeqNum; MSGpkt->macSrcAddr = aff->macSrcAddr; MSGpkt->macDestAddr = aff->macDestAddr; MSGpkt->srcAddr.panId = SrcPanId; MSGpkt->cmd.TransSeqNumber = 0; MSGpkt->cmd.DataLength = aff->asduLength; MSGpkt->radius = radius; if ( MSGpkt->cmd.DataLength ) { MSGpkt->cmd.Data = (uint8 *)(MSGpkt + 1); osal_memcpy( MSGpkt->cmd.Data, asdu, MSGpkt->cmd.DataLength ); } else { MSGpkt->cmd.Data = NULL; } #if defined ( MT_AF_CB_FUNC ) // If ZDO or SAPI have registered for this endpoint, dont intercept it here if (AFCB_CHECK(CB_ID_AF_DATA_IND, *(epDesc->task_id))) { MT_AfIncomingMsg( (void *)MSGpkt ); // Release the memory. osal_msg_deallocate( (void *)MSGpkt ); } else #endif { // Send message through task message. osal_msg_send( *(epDesc->task_id), (uint8 *)MSGpkt ); } }
/********************************************************************* * @fn afReflectError * * @brief This function will generate the Reflect Error message to * the application. * * @param srcEP - Source Endpoint * @param dstAddrMode - mode of dstAdd - 0 - normal short addr, 1 - group Address * @param dstAddr - intended destination * @param dstEP - Destination Endpoint * @param transID - transaction ID from APSDE_DATA_REQUEST * @param status - status of APSDE_DATA_REQUEST * * @return none */ void afReflectError( uint8 srcEP, uint8 dstAddrMode, uint16 dstAddr, uint8 dstEP, uint8 transID, ZStatus_t status ) { endPointDesc_t *epDesc; afReflectError_t *msgPtr; // Find the endpoint description epDesc = afFindEndPointDesc( srcEP ); if ( epDesc == NULL ) return; // Determine the incoming command type msgPtr = (afReflectError_t *)osal_msg_allocate( sizeof(afReflectError_t) ); if ( msgPtr ) { // Build the Data Confirm message msgPtr->hdr.event = AF_REFLECT_ERROR_CMD; msgPtr->hdr.status = status; msgPtr->endpoint = dstEP; msgPtr->transID = transID; msgPtr->dstAddrMode = dstAddrMode; msgPtr->dstAddr = dstAddr; #if defined ( MT_AF_CB_FUNC ) /* If MT has subscribed for this callback, don't send as a message. */ if ( AFCB_CHECK( CB_ID_AF_REFLECT_ERROR, *(epDesc->task_id) ) ) { /* Send callback if it's subscribed */ MT_AfReflectError( (void *)msgPtr ); /* Release the memory. */ osal_msg_deallocate( (void *)msgPtr ); } else #endif { /* send message through task message */ osal_msg_send( *(epDesc->task_id), (uint8 *)msgPtr ); } } }
/********************************************************************* * @fn afDataConfirm * * @brief This function will generate the Data Confirm back to * the application. * * @param endPoint - confirm end point * @param transID - transaction ID from APSDE_DATA_REQUEST * @param status - status of APSDE_DATA_REQUEST * * @return none */ void afDataConfirm( uint8 endPoint, uint8 transID, ZStatus_t status ) { endPointDesc_t *epDesc; afDataConfirm_t *msgPtr; // Find the endpoint description epDesc = afFindEndPointDesc( endPoint ); if ( epDesc == NULL ) return; // Determine the incoming command type msgPtr = (afDataConfirm_t *)osal_msg_allocate( sizeof(afDataConfirm_t) ); if ( msgPtr ) { // Build the Data Confirm message msgPtr->hdr.event = AF_DATA_CONFIRM_CMD; msgPtr->hdr.status = status; msgPtr->endpoint = endPoint; msgPtr->transID = transID; #if defined ( MT_AF_CB_FUNC ) /* If MT has subscribed for this callback, don't send as a message. */ if ( AFCB_CHECK(CB_ID_AF_DATA_CNF,*(epDesc->task_id)) ) { /* Send callback if it's subscribed */ MT_AfDataConfirm ((void *)msgPtr); /* Release the memory. */ osal_msg_deallocate( (void *)msgPtr ); } else #endif { /* send message through task message */ osal_msg_send( *(epDesc->task_id), (byte *)msgPtr ); } } }