⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aps.c

📁 ucos在NEC平台下的移植
💻 C
📖 第 1 页 / 共 3 页
字号:
//		 phyReleaseTxLock();
//		 apsState = APS_STATE_IDLE;
//		 if (aps_pib.flags.bits.indirectPending) {
//			 //have used this state to wait for finishing sending an
//			 //ACK back to the source of an indirect transmit. Now
//			 //finish resolving the indirect
//			 goto apsFSM_start;
//		 }
//
//
//		 break;
//
//	 case APS_STATE_NWK_PASSTHRU_WAIT:
//		 //for split-phase passthrus
//		 if (nwkBusy()) break;
//		 a_aps_service.status = a_nwk_service.status;
//		 apsState = APS_STATE_IDLE;
//		 break;
//
//	 case APS_STATE_INJECT_LOOPBACK:
//		 //wait for RX to become idle
//		 if (apsRxState != APS_RXSTATE_IDLE) break;
//		 //inject packet into RX FSM
//		 apsInjectPacket(FALSE);
//		 aps_pib.flags.bits.IsUsrBufferFree = 1;
//		 apsState = APS_STATE_IDLE;
//		 goto apsFSM_start;
//
//#ifdef LRWPAN_COORDINATOR
//	 case APS_STATE_INJECT_INDIRECT:
//		 //wait for RX to become idle
//		 if (apsRxState != APS_RXSTATE_IDLE) break;
//		 //inject packet into RX FSM
//		 if (apsRxBuffFull()) {
//			 //will not be able to copy buffer into indirect space
//			 a_aps_service.status = LRWPAN_STATUS_INDIRECT_BUFFER_FULL;
//		 }else {
//			 apsInjectPacket(TRUE);
//		 }
//		 aps_pib.flags.bits.IsUsrBufferFree = 1;
//		 apsState = APS_STATE_IDLE;
//		 goto apsFSM_start;
//
//#endif
//
//#ifdef LRWPAN_COORDINATOR
//	 case APS_STATE_INDIRECT_GETDST:
//		 rxPtr = &aps_pib.rxBuff[aps_pib.rxTail];
//		 //get the next bind destination for this src endpoint, cluster
//		 if (!evbResolveBind(&rxPtr->dstEP, &rxPtr->dstSADDR)) {
//			 //at this point, we have finished with the indirect transmit.
//			 //lets free the original packet, and continue
//			 apsFreeRxPacket(TRUE);
//			 apsState = APS_STATE_IDLE;
//		 } else {
//			 //we have destination
//			 //see if we are sending to ourself
//			 if (rxPtr->dstSADDR == macGetShortAddr()) {
//				 apsState = APS_STATE_INDIRECT_LOOPBACK;
//			 }else {
//				 apsState = APS_STATE_INDIRECT_TX;
//			 }
//			 goto apsFSM_start;
//		 }
//		 break;
//
//	 case APS_STATE_INDIRECT_LOOPBACK:
//		 if (apsRxBusy()) break;  //wait until RX buffer free
//		 //copy to RX buffer
//		 rxPtr = &aps_pib.rxBuff[aps_pib.rxTail];
//		 halUtilMemCopy((BYTE *)&a_aps_rx_data,(BYTE *)rxPtr, sizeof(APS_RX_DATA));
//		 //do user callback
//		 usrRxPacketCallback();
//		 apsState = APS_STATE_INDIRECT_GETDST;
//		 goto apsFSM_start;
//
//
//	 case APS_STATE_INDIRECT_TX:
//		 //have a destination for our indirect TX. Lets do it.
//		 if (phyTxLocked()) break;
//		 phyGrabTxLock();
//		 rxPtr = &aps_pib.rxBuff[aps_pib.rxTail];
//		 a_aps_tx_data.aps_fcf = rxPtr->aps_fcf;
//		 a_aps_tx_data.tsn = rxPtr->tsn;
//		 a_aps_tx_data.af_fcf = rxPtr->af_fcf;
//		 a_aps_tx_data.dstEP = rxPtr->dstEP;
//		 a_aps_tx_data.dstMode = APS_DSTMODE_SHORT;
//		 a_aps_tx_data.dstSADDR = rxPtr->dstSADDR;
//		 a_aps_tx_data.cluster = rxPtr->cluster;
//		 a_aps_tx_data.usrPlen = rxPtr->usrPlen;
//		 a_aps_tx_data.usrPload = rxPtr->usrPload;
//		 phy_pib.currentTxFlen = 0;  //set frame length to zero, build from scratch
//		 apsTxData(TRUE);
//		 apsState = APS_STATE_INDIRECT_TX_WAIT;
//		 break;
//
//		 //wait for last indirect TX to finish
//	 case APS_STATE_INDIRECT_TX_WAIT:
//		 if (nwkBusy()) break;
//		 //at this point we have a status, but can't do much about it.
//		 //either it went through or it did not.
//		 //release the TX buffer lock before exiting.
//		 phyReleaseTxLock();
//		 //loop around, and see if there is another destination for this indirect packet
//		 apsState = APS_STATE_INDIRECT_GETDST;
//		 goto apsFSM_start;
//
//#endif
//
//
//	 default:  break;
//
//
//	}//end switch(apsState)
//	HAL_SUSPEND(0);  //for WIN32   --li
}


//inject this packet into stack as if it has been received
//so that the binding can be resolved.
static void apsInjectPacket(BOOL indirect_flag){
//	BYTE *dst;
//
//	//allocate some heap space for this data
//	if (a_aps_tx_data.usrPlen) {
//	   a_aps_rx_data.orgpkt.data = MemAlloc(a_aps_tx_data.usrPlen);
//	   if (!a_aps_rx_data.orgpkt.data ) {
//	  	  //can't even get started, return
//		  a_aps_service.status = LRWPAN_STATUS_HEAPFULL;
//		 return;
//	   }
//	}
//	//copy user payload into new space
//	dst = a_aps_rx_data.orgpkt.data;
//	a_aps_rx_data.usrPlen = a_aps_tx_data.usrPlen;  //save len
//	while(a_aps_tx_data.usrPlen){
//		*dst = *a_aps_tx_data.usrPload;  //copy data
//		a_aps_tx_data.usrPload++;
//		dst++;
//		a_aps_tx_data.usrPlen--;
//	}
//	//set up rest of rx data
//	a_aps_rx_data.cluster = a_aps_tx_data.cluster;
//	a_aps_rx_data.af_fcf = a_aps_tx_data.af_fcf;
//	a_aps_rx_data.srcEP = a_aps_tx_data.srcEP;
//	a_aps_rx_data.srcSADDR = a_aps_tx_data.srcSADDR;
//	a_aps_rx_data.usrPload = a_aps_rx_data.orgpkt.data;
//	a_aps_rx_data.dstEP = a_aps_tx_data.dstEP;
//	a_aps_rx_data.orgpkt.rssi = 0xFF;  //highest value
//
//
//	if (indirect_flag) {
//#ifdef LRWPAN_COORDINATOR
//		//this packet has arrived at the coordinator
//		a_aps_rx_data.dstSADDR = 0;
//		//ensure that the submode bit is a '1'
//		a_aps_rx_data.aps_fcf = a_aps_tx_data.aps_fcf |APS_FRM_INDIRECT_SUBMODE_MASK ;
//
//		//copy data into indirect buffer space
//		apsRxBuffAdd(&a_aps_rx_data);
//
//		//set the RX FSM to the pending state
//		aps_pib.flags.bits.indirectPending = 1;
//		apsRxState = APS_RXSTATE_RESOLVE_INDIRECT;
//
//#endif
//		//at this point, we have simulated this packet being
//		//received by the stack. When we return, the mainFSM
//		//will process it, resolve the indirect binding, and re-transmit
//	} else {
//		//this is a direct packet sent to ourselves
//		//check for DST endpoint of 0, special endpoint
//		if (a_aps_rx_data.dstEP == 0) {
//			//not a user endpoint, handle this
//			DEBUG_STRING(DBG_INFO,"APS: Received ZEP Request.\n");
//			zepHandleRxPacket();
//			MemFree(a_aps_rx_data.orgpkt.data);				
//		} else {
//			//deliver to user endpoint right here.
//			usrRxPacketCallback();
//			//finished, free the space
//			MemFree(a_aps_rx_data.orgpkt.data);
//		}
//
//	}
//	a_aps_service.status = LRWPAN_STATUS_SUCCESS;  --li

}



//Add the AF and APS headers, then send it to NWK
//the AF header probably should be a seperate layer,
//but will place it here since we are only handling MSG frames,
//reduces the depth of the stack.

void apsTxData(BOOL copy_payload) {

//	BYTE *src;
//
//	//if currentTxFlen is zero, we need to build the frame, else, it is
//	// a retransmission
//	if (phy_pib.currentTxFlen == 0) {
//		//assume that the frame is just now being built.
//		//use temporary space for building frame
//		if (copy_payload){
//			//copy user payload into tmpTxBuff space
//			//if userPlen is 0, nothing is copied into the payload area
//			phy_pib.currentTxFrm = &tmpTxBuff[LRWPAN_MAX_FRAME_SIZE];
//			//get a pointer to the end of the payload
//			src = a_aps_tx_data.usrPload + a_aps_tx_data.usrPlen;
//			phy_pib.currentTxFlen = a_aps_tx_data.usrPlen;
//			//now copy the user payload to the frame
//			while (phy_pib.currentTxFlen) {
//				src--;                //decrement to first src location with data
//				phy_pib.currentTxFrm--;     //decrement to free location
//				phy_pib.currentTxFlen--;    //decrement length
//				*(phy_pib.currentTxFrm) = *src;
//			}
//		} else {
//			//assume that TXBuff already has the payload, the ZEP
//			//commands build their payload in this space
//			//point currentTxFrm to this payload
//			phy_pib.currentTxFrm = &tmpTxBuff[LRWPAN_MAX_FRAME_SIZE] - a_aps_tx_data.usrPlen;
//		}
//		//restore length
//		phy_pib.currentTxFlen = a_aps_tx_data.usrPlen;
//
//		if (APS_IS_DATA(a_aps_tx_data.aps_fcf)) {
//			//DATA frame
//			//Build AF header.
//			//ONLY MSG FRAMES ARE SUPPORTED, so all we need to write is the
//			//length of user payload
//			--phy_pib.currentTxFrm; phy_pib.currentTxFlen++;
//			*phy_pib.currentTxFrm = a_aps_tx_data.usrPlen;
//
//			//sequence number
//			--phy_pib.currentTxFrm; phy_pib.currentTxFlen++;
//			*phy_pib.currentTxFrm = a_aps_tx_data.tsn;
//
//			//AF frame control
//			--phy_pib.currentTxFrm; phy_pib.currentTxFlen++;
//			*phy_pib.currentTxFrm = a_aps_tx_data.af_fcf;
//		}
//
//
//		if (APS_GET_FRM_DLVRMODE(a_aps_tx_data.aps_fcf) == APS_FRM_DLVRMODE_INDIRECT){
//			//this is indirect packet
//#ifdef LRWPAN_COORDINATOR
//			//TX packet from coordinator, ensure that the submode bit is a '0'
//
//			a_aps_tx_data.aps_fcf = a_aps_tx_data.aps_fcf & ~APS_FRM_INDIRECT_SUBMODE_MASK ;
//			//the dstSADDR has already been filled in during the binding resolution, copy to nwk
//			a_nwk_tx_data.dstSADDR = a_aps_tx_data.dstSADDR;
//
//#else
//			//the destination for indirect packets is the coordinator
//			a_nwk_tx_data.dstSADDR = 0;
//			//ensure that the submode bit is a '1'
//			a_aps_tx_data.aps_fcf = a_aps_tx_data.aps_fcf |APS_FRM_INDIRECT_SUBMODE_MASK ;
//#endif
//		} else {
//			//copy destination address
//
//			a_nwk_tx_data.dstSADDR = a_aps_tx_data.dstSADDR;
//			a_nwk_tx_data.dstLADDR = a_aps_tx_data.dstLADDR;
//		}
//
//
//
//		//Build APS header.
//		//SRC Endpoint
//		if (!(((APS_GET_FRM_DLVRMODE(a_aps_tx_data.aps_fcf))==APS_FRM_DLVRMODE_INDIRECT) &&
//			(!APS_GET_FRM_INDIRECT_SUBMODE(a_aps_tx_data.aps_fcf)))){
//				//SRC endpoint is only omitted if INDIRECT frame and
//				//indirect sub-mode bit is a '0'
//				--phy_pib.currentTxFrm;phy_pib.currentTxFlen++;
//				*phy_pib.currentTxFrm=a_aps_tx_data.srcEP;
//			}
//
//			//profile ID
//			if ((APS_GET_FRM_TYPE(a_aps_tx_data.aps_fcf) == APS_FRM_TYPE_DATA)||
//				(APS_GET_FRM_TYPE(a_aps_tx_data.aps_fcf) == APS_FRM_TYPE_ACK)) {
//					//insert the profile ID, this hardcoded by the configuration
//					--phy_pib.currentTxFrm;phy_pib.currentTxFlen++;
//					*phy_pib.currentTxFrm= (BYTE) ((LRWPAN_APP_PROFILE) >> 8);
//					--phy_pib.currentTxFrm;phy_pib.currentTxFlen++;
//					*phy_pib.currentTxFrm = 0xFF & LRWPAN_APP_PROFILE ;
//				}
//				//cluster ID
//				if (APS_GET_FRM_TYPE(a_aps_tx_data.aps_fcf) == APS_FRM_TYPE_DATA) {
//					--phy_pib.currentTxFrm;phy_pib.currentTxFlen++;
//					*phy_pib.currentTxFrm= a_aps_tx_data.cluster;
//				}
//
//
//				//Destination EP
//				if (!(((APS_GET_FRM_DLVRMODE(a_aps_tx_data.aps_fcf))==APS_FRM_DLVRMODE_INDIRECT) &&
//					(APS_GET_FRM_INDIRECT_SUBMODE(a_aps_tx_data.aps_fcf)))){
//						//DST endpoint is only omitted if INDIRECT frame and
//						//indirect sub-mode bit is a '1'
//						--phy_pib.currentTxFrm;phy_pib.currentTxFlen++;
//						*phy_pib.currentTxFrm=a_aps_tx_data.dstEP;
//					}
//
//					//frame control
//					--phy_pib.currentTxFrm;phy_pib.currentTxFlen++;
//					*phy_pib.currentTxFrm=a_aps_tx_data.aps_fcf;
//
//					if (a_aps_tx_data.flags.bits.loopback) {
//						//Zep commands to ourselves have to go all the way through formatting
//						//before we inject them into stack
//						apsInjectTxPacket();
//						
//					} else {
//
//						//setup call to network layer
//						//use the SRC address passed in by the aps layer
//						//will be the SADDR of the originating node for this message
//						a_nwk_tx_data.srcSADDR = a_aps_tx_data.srcSADDR;
//
//						//now set the network bytes
//						//since we are using tree routing, the Route Discovery is always suppressed.
//						a_nwk_tx_data.radius = LRWPAN_NWK_MAX_RADIUS;
//						a_nwk_tx_data.fcflsb = NWK_FRM_TYPE_DATA | NWK_PROTOCOL | NWK_SUPPRESS_ROUTE_DISCOVER ;
//
//						//Send via the network layer
//						a_nwk_service.cmd = LRWPAN_SVC_NWK_GENERIC_TX;
//
//						// at this point, we will attempt a TX
//						if (APS_GET_FRM_ACKREQ(a_aps_tx_data.aps_fcf)){
//							//need an ACK back. set ackPending bit, start timer.
//							aps_pib.flags.bits.ackPending = 1;
//							aps_pib.tx_start_time = halGetMACTimer();
//							//lets compute our Ack Wait duration
//							//aps_pib.apscAckWaitDuration
//							aps_pib.apsAckWaitMultiplier = nwkGetHopsToDest(a_nwk_tx_data.dstSADDR);
//							aps_pib.apsAckWaitMultiplierCntr = aps_pib.apsAckWaitMultiplier;
//						}
//						else aps_pib.flags.bits.ackPending = 0;
//						apsSetTxBusy();
//						aps_pib.currentAckRetries = aps_pib.apscMaxFrameRetries; //set retry count
//						apsTxFSM_status = LRWPAN_STATUS_APS_INPROGRESS;
//
//						//we need to remember this offset in case of a retry, as we
//						//will have to reset the flen to this point
//						a_aps_tx_data.aps_flen = phy_pib.currentTxFlen;
//						a_aps_tx_data.aps_ptr = phy_pib.currentTxFrm;
//					}
//
//	}
//
//	if (!a_aps_tx_data.flags.bits.loopback)   nwkDoService();  --li

}

//inject this packet into stack as if it has been received
//so that the binding can be resolved.
static void apsInjectTxPacket(void){

	////allocate some heap space for this data
	//a_aps_rx_data.orgpkt.data = MemAlloc(phy_pib.currentTxFlen);
	//a_aps_rx_data.apsOffset =0;
	//if (!a_aps_rx_data.orgpkt.data ) {
	//	//can't even get started, return
	//	//we use th apsTxFSM status to return this status since we are injecting from TX machine
	//	apsTxFSM_status = LRWPAN_STATUS_HEAPFULL;
	//	return;
	//}
	////copy tx buffer into rx space
	//halUtilMemCopy(a_aps_rx_data.orgpkt.data, phy_pib.currentTxFrm, phy_pib.currentTxFlen);
	////set up FCF, RSSI, everything else will be parsed from packet
	//a_aps_rx_data.aps_fcf = a_aps_tx_data.aps_fcf;
	////insure that APS field ACK field is NOT set since we will not be getting an ACK back
	//a_aps_rx_data.aps_fcf &= ~APS_FRM_ACKREQ_MASK;
 //   *(a_aps_rx_data.orgpkt.data) = a_aps_rx_data.aps_fcf;

	//a_aps_rx_data.orgpkt.rssi = 0xFF;  //highest value since loopback
	//a_aps_rx_data.flags.val = 0;
	//apsRxState = APS_RXSTATE_START; //kick off RX FSM
	//apsRxFSM(); //call apsRxFSM to process packet
	//apsTxFSM_status = LRWPAN_STATUS_SUCCESS;   --li
}



//handle RX of packets at APS level
static void apsRxFSM(void)
{
//	LRWPAN_STATUS_ENUM callback_status;
//
//
//apsRxFSM_start:
//
// switch(apsRxState) {
//  case APS_RXSTATE_IDLE:
//	  break;
//  case APS_RXSTATE_START:
//	  //we have a packet, lets check it out.
//
//	  if (APS_IS_RSV(a_aps_rx_data.aps_fcf)) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -