📄 cdatams.cpp
字号:
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 + -