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

📄 cdatams.cpp

📁 此程序为wcdma系统当中ftp/video业务模型的c++程序仿真 通过此程序 能得到此两种业务在多种条件下的吞吐量和无码率的性能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	char buf[50];
	// 打开数据文件准备写
 	if(!f.Open("HSSectorStatics.txt",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
	{
	    #ifdef _DEBUG
		afxDump<<"Unable to open file"<<"\n";	//异常处理
	    #endif
	 }
	
	f.SeekToEnd(); 
	_itoa(m_pMsManager->m_iSlotCurrentNum,buf,10);
	f.WriteString(buf);
	f.WriteString("\t");

	_itoa(m_iMsID,buf,10);
	 f.WriteString(buf);
	 f.WriteString("\t");
   
	_itoa(m_lTotalSucfulBitNum,buf,10);
	 f.WriteString(buf);
	 f.WriteString("\t");

	 _itoa(pCurSector->GetGoodBitNum(),buf,10);
	 f.WriteString(buf);
	 f.WriteString("\n");

	 f.Close();
// end compile */

		if(	m_enTrafficType == HTTP	)
		{	
			//统计分组和分组呼叫相关属性
			if(	m_bIsCurrentPacketOver == true	)
			{
				//累加服务扇区分组数和分组时延
				int iSectorPacketNum = pCurSector->GetPacketNum();
				iSectorPacketNum += m_iTransPacketNum;
				pCurSector->SetPacketNum(iSectorPacketNum);
				
				int iSucfulPacketNum = pCurSector->GetSectorSucfulPacketNum();
				iSucfulPacketNum += m_iTTISucfulPacketNum;
				pCurSector->SetSectorSucfulPacketNum(iSucfulPacketNum);

				int iFailedPacketNum = pCurSector->GetSectorFailedPacketNum();
				iFailedPacketNum += m_iTTIFailedPacketNum;
				pCurSector->SetSectorFailedPacketNum(iFailedPacketNum);

				int iSectorPacketDelay = pCurSector->GetPacketDelay();
				iSectorPacketDelay += m_iCurrentPacketDelay;
				pCurSector->SetPacketDelay(iSectorPacketDelay);

				if(	m_bIsCurrentPCOver == true	)
				{
					//累加服务扇区分组呼叫数、分组呼叫时延和分组呼叫比特数
					int iSectorPCNum = pCurSector->GetPacketCallNum();
					iSectorPCNum += m_iTransPCNum;
					pCurSector->SetPacketCallNum(iSectorPCNum);

					int iSectorPCDelay = pCurSector->GetPacketCallDelay();
					iSectorPCDelay += m_iCurrentPCDelay;
					pCurSector->SetPacketCallDelay(iSectorPCDelay);

					long lSectorPCBitNum = pCurSector->GetPacketCallBitNum();
					lSectorPCBitNum += m_lSucfulPCBitNum;
					pCurSector->SetPacketCallBitNum(lSectorPCBitNum);
				}
				else
				{
					//分组呼叫尚未结束,不需要统计
				}
			}
			else
			{
				//分组尚未结束,不需要统计
			}
		}
		else if(	m_enTrafficType == FTP	)
		{
			////ftp移动台没有分组统计操作
		}
		else
		{
			////notice 对其他业务类型的处理
		}			
	}
	else
	{
			////处理完毕,对其他数据移动台类型的处理
	}
		 

}
/////////////////////////////////////////////////////////////////////////
//
//	TITLE:	重传控制函数
//
//	PURPOSE:	统计重传失败传输块的属性,设定新的TTI传输块集属性
//
//	SAMPLE CALL:	pHttpDataMs->ReTransControl()
//			
//	CALLED BY FUNCTIONS:	CMsManager::DCHMsListProcess()
//			
//	CALLING FUNCTIONS:
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
//	MODIFICATIONS SINCE 04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////	
void CDataMs::ReTransControl(void)
{
	////调整记录传输块传输次数数组中元素的位置
	////将需要进行重穿的穿数块的传输次数调整到数组的前列
	//指向需要交换的位置
	int *ipPosition = &m_iaBLTransNum[0];
	//标志需要交换位置的下标
	int itempIndex = 0;
	//是否已经交换的标志
	bool bIsChanged = false;
	
	for(	int itemp1 = 0; itemp1 <m_pstTFI->iTransBLNum; ++itemp1	)
	{
		////确定交换位置
		ipPosition = &m_iaBLTransNum[itempIndex];
		bIsChanged = false;

		if(	m_iaBLTransNum[ itemp1 ] == MAXTRANSNUM	)
		{
			//复位传输次数记录
			 m_iaBLTransNum[ itemp1 ] = 0;

			 //传输次数记录位置为0,交换位置不变
				
		}
		else if(	m_iaBLTransNum[ itemp1 ] >0 && m_iaBLTransNum[ itemp1 ]<MAXTRANSNUM	)
		{
			//传输次数记录不修改,需要修改交换位置
			++itempIndex; 
		}
		else 
		{
			//传输次数记录为0,交换位置不变
		}
		
		for(	int itemp2 = itempIndex+1;itemp2<m_pstTFI->iTransBLNum; ++ itemp2	)
		{
			////实现传输块传输次数记录的交换
			if(	m_iaBLTransNum[ itemp2 ] == MAXTRANSNUM	)
			{
				//复位传输次数记录,不用交换
			 	m_iaBLTransNum[ itemp2] = 0;
					
			}
			else if(	m_iaBLTransNum[ itemp2 ] >0 && m_iaBLTransNum[ itemp2 ]<MAXTRANSNUM	)
			{
				//传输次数记录不修改,需要交换位置
				m_iaBLTransNum[itempIndex] = m_iaBLTransNum[itemp2];
				m_iaBLTransNum[itemp2] = 0;
				bIsChanged = true;
					
				//需要修改交换位置
				++itempIndex;

				//已经进行了传输次数位置交换,结束这次for循环。进行下面对bIsChanged的判断
				break;
			}
			else 
			{
				//传输次数记录为0,不需要交换位置并且交换位置不变
			}
		}

		if(	bIsChanged == true	)
		{
			////在for循环中实现了传输次数记录位置交换,这里没有操作
		}
		else
		{
			////在for循环中没有实现传输次数的位置交换,需要修改交换位置
			//避免在当前for循环中出现死循环
			++itempIndex;
		}
	
		
	}
		
}

/////////////////////////////////////////////////////////////////////////
//
//	TITLE:	传输块集校验函数
//
//	PURPOSE:	判断TTI内传输块是否正确传输,设置传输块传输次数记录;
//				统计TTI内传输块和比特的传输情况,统计结果由CDataMs中的变量记录
//				递减CDataMs数据队列长度
//
//	SAMPLE CALL:	pHttpDataMs->TTICRC()
//			
//	CALLED BY FUNCTIONS:	CMsManager::DCHMsListProcess()
//			
//	CALLING FUNCTIONS:
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
//	MODIFICATIONS SINCE 04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CDataMs::TTICRCAndStatics(void)
{	
	////根据链路级提供的误块率判断传输块的是否正确传输

	//传输块传输次数累加,完成一次传输后每个传输块的传输次数加1
	for(	int itemp = 0; itemp < m_pstRate->pTFI->iTransBLNum; ++itemp	)
	{
		m_iaBLTransNum[ itemp ] +=1;
	}

	//调用误码率预测函数,得到链路级提供的误码率
	BLERPredict();

	float tempbler = 0.0;
	for(	itemp = 0 ; itemp < m_pstRate->pTFI->iTransBLNum ; ++itemp	)
	{
		tempbler = xUniform();
		if(	tempbler >= m_fTTIBLER	)
		{
			//notice 这里是否需要考虑RLC层ACK/NACK的差错
			//暂时不考虑
			m_iaBLTransNum[ itemp ] = 0;	//清除传输次数记录
											//表示当前itemp位置对应的传输块正确传输
		}	
	}

	////统计TTI内的传输信息
	//记录TTI内填充比特情况,并且对混合了填充比特和信息比特的传输块进行处理
	int iPadding = 0;
	int iPaddingBLNum = 0;
	int iRemainBitNum = 0;
	int iTotalBit = (m_pstRate->pTFI->iTransBLNum)*(m_pstRate->pTFI->iTransBLSize);

	if(	m_lDataQueueSize < iTotalBit	)
	{
		////存在填充情况下的处理
		iPadding = iTotalBit - m_lDataQueueSize;	//记录填充比特数
		iPaddingBLNum = int(	ceil( (float)iPadding/(float)(m_pstRate->pTFI->iTransBLSize) )	) ;
        iRemainBitNum = m_lDataQueueSize%(m_pstRate->pTFI->iTransBLSize);
        
	   	if(	iRemainBitNum != 0	)
		{
			////TTI内存在混合了填充比特和信息比特的传输块
			//统计TTI传输结束后,本TTI内传输块的传输信息;不考虑填充比特构成的传输块
			for(int itemp =0; itemp< m_pstRate->pTFI->iTransBLNum - iPaddingBLNum; itemp++)
			{	
				if(	m_iaBLTransNum[ itemp ] == MAXTRANSNUM	)
				{
					//累计TTI内传输失败的分组数,比特数
					++m_iTTIFailedBLNum;
					m_iTTIFailedBitNum += m_pstRate->pTFI->iTransBLSize;
				}
				else if(	m_iaBLTransNum[ itemp ] == 0  	)
				{
					//累加TTI内正确传输的传输块数,比特数
					++m_iTTISucfulBLNum;
					m_iTTISucfulBitNum += m_pstRate->pTFI->iTransBLSize;
				}
				else
				{}
			}
			
			//考虑由信息比特和填充比特构成的传输块的处理
			if(	m_iaBLTransNum[	m_pstRate->pTFI->iTransBLNum - iPaddingBLNum	] == MAXTRANSNUM	)
			{
				//累计TTI内传输失败的分组数,比特数
				++m_iTTIFailedBLNum;
				m_iTTIFailedBitNum += iRemainBitNum;
			}
			else if(	m_iaBLTransNum[	m_pstRate->pTFI->iTransBLNum - iPaddingBLNum	] == 0	)
			{
				//累加TTI内正确传输的传输块数,比特数
				++m_iTTISucfulBLNum;
				m_iTTISucfulBitNum += iRemainBitNum;
			}
			else{}

			//将填充比特构成的传输块传输次数设置为0,不考虑它的重传
			for(	itemp = (m_pstRate->pTFI->iTransBLNum - iPaddingBLNum + 1); itemp < m_pstRate->pTFI->iTransBLNum; itemp++	)
				m_iaBLTransNum[	itemp	] = 0;
		}
		else
		{
			////TTI内不存在混合了填充比特和信息比特的传输块
			//统计TTI传输结束后,本TTI内传输块的传输信息;不考虑填充比特构成的传输块
			for(int itemp =0; itemp< m_pstRate->pTFI->iTransBLNum - iPaddingBLNum; itemp++)
			{	
				if(	m_iaBLTransNum[ itemp ] == MAXTRANSNUM	)
				{
					//累计TTI内传输失败的分组数,比特数
					++m_iTTIFailedBLNum;
					m_iTTIFailedBitNum += m_pstRate->pTFI->iTransBLSize;
				}
				else if(	m_iaBLTransNum[ itemp ] == 0	)
				{
					//累加TTI内正确传输的传输块数,比特数
					++m_iTTISucfulBLNum;
					m_iTTISucfulBitNum += m_pstRate->pTFI->iTransBLSize;
				}
				else{}
			}

			////将填充比特构成的传输块传输次数设置为0,不考虑它的重传
			for(	itemp = m_pstRate->pTFI->iTransBLNum - iPaddingBLNum; itemp < m_pstRate->pTFI->iTransBLNum; itemp++	)
				m_iaBLTransNum[	itemp	] = 0;
		}
	}
	else
	{
		////不存在填充比特情况下的处理
		////统计TTI传输结束后,本TTI内传输块的传输信息
		for(int itemp =0; itemp< m_pstRate->pTFI->iTransBLNum; itemp++)
		{	
			if(	m_iaBLTransNum[ itemp ] == MAXTRANSNUM	)
			{
				//累计TTI内传输失败的分组数,比特数
				++m_iTTIFailedBLNum;
				m_iTTIFailedBitNum += m_pstRate->pTFI->iTransBLSize;
			}
			else if(	m_iaBLTransNum[ itemp ] == 0	)
			{
				//累加TTI内正确传输的传输块数,比特数
				++m_iTTISucfulBLNum;
				m_iTTISucfulBitNum += m_pstRate->pTFI->iTransBLSize;
			}
			else{}
		}
	}

	////修改数据队列的长度,忽略填充比特
	int iTotalTransBitNum = m_iTTISucfulBitNum + m_iTTIFailedBitNum;

	if(	m_lDataQueueSize <= iTotalTransBitNum	)	
		m_lDataQueueSize = 0;
	else
		m_lDataQueueSize -= iTotalTransBitNum;

	////HTTP数据移动台需要统计当前TTI内分组和分组呼叫相关属性
	if(	m_enTrafficType == HTTP	)
	{
		HandlePacket();
	}
	else if(	m_enTrafficType == FTP	)
	{
		//对FTP移动台没有处理
	}
	else
	{
		//对其他业务类型的处理
	}
}


/////////////////////////////////////////////////////////////////////////
//
//	TITLE:	TTI是否结束的判断函数
//
//	PURPOSE:	判断TTI是否结束
//
//	SAMPLE CALL:	pHttpDataMs->IsTTIEnd()
//			
//	CALLED BY FUNCTIONS:	CMsManager::DCHMsListProcess()
//			
//	CALLING FUNCTIONS:
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
//	MODIFICATIONS SINCE 04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
bool CDataMs::IsTTIEnd(void)
{
	if(	m_iSlotNumRemained > 0	)
	{
		return false;
	}
	else 
	{
		//设置传输标志
		m_bIsTransNow=false;
		return true;
	}
}	

//d功率控制相关方法
/////////////////////////////////////////////////////////////////////////
//
//	TITLE:	DCH信道C2I计算函数
//
//	PURPOSE:	处于DCH信道的移动台有激活集,计算激活集中所有导频的业务信道C2I之和,
//				并记入m_fTTIC2I数组中对应的时隙位置
//
//	SAMPLE CALL:	pHttpDataMs->DCHC2ICalculate()
//			
//	CALLED BY FUNCTIONS:	CMsManager::DCHMsListProcess()
//			
//	CALLING FUNCTIONS:
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
//	MODIFICATIONS SINCE 04/04(MM/YY)
//
////////////////////////////////////////////////////////////////////////////
void CDataMs::DCHC2ICalculate(void)
{
	////计算本时隙内的C2I
	if(	m_eUsertype == DCHData	)
	{
		////处在DCH信道
		POSITION postemp;                          
		float ftempC2I;
		float fsumoftempC2I = 0;
		postemp = m_ActiveSetList.GetHeadPosition();   
		ACTIVESECTOR_TYPE *ptempActiveSector = NULL;
		while(	postemp != NULL	)
		{
			ptempActiveSector = m_ActiveSetList.GetNext( postemp );
			ftempC2I = ( float )pow( 10, ptempActiveSector->fTrafficC2I/10 );
			fsumoftempC2I += ftempC2I;
		}
			 
		 //设定当前时隙业务信道C2I
		m_fSlotC2IindB[ m_pstTFI-> iTTISlotNum - m_iSlotNumRemained] = ( float ) (	10*log10(	fsumoftempC2I  	)	);
	}
		
	else
	{
		//处在DSCH信道
		//notice 获取当前时隙的C2I是为了进行功率控制,在DSCH信道不是这样的处理过程。这里没有操作
	}
}
/////////////////////////////////////////////////////////////////////////
//
//	TITLE:	DCH功率控制函数
//
//	PURPOSE:	对处于DCH信道的移动台进行功控,更新移动台归属激活集的DCH信道功率
//
//	SAMPLE CALL:	pHttpDataMs->DCHPowerControl()
//			
//	CALLED BY FUNCTIONS:	CMsManager::DCHMsListProcess()
//			
//	CALLING FUNCTIONS:
//	
//	AUTHOR:	Chen Meiya 
//
//	DATE:	04/04(MM/YY)
//
//	MODIFICATIONS SINCE 04/04(MM/YY)

⌨️ 快捷键说明

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