📄 cnetworkdrive.cpp
字号:
m_iDataStaticsSlotNum=(int)pval[1];
m_iStaticsFileNum=(int)pval[2];
m_MsManager.SetSystemMeanThroughputFile(datafilename[0]);
m_MsManager.SetSystemMeanPERFile(datafilename[1]);
m_ServiceArea.SetBsOutrageDataFileName(datafilename[2]);
m_MsManager.SetMobileC2IFile(datafilename[3]);
m_MsManager.SetMobileThroughputServiceFile(datafilename[4]);
m_MsManager.SetMobileThroughputPacketCallFile(datafilename[5]);
m_MsManager.SetVoiceFile(datafilename[6]);
f1.Close();//关闭参数文件
}
//////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////
void CNetworkDrive::ReadData_FastFadingValue()
{
CStdioFile f1; //定义一个I/O文件对象
char buf[100];
int ii;
char* q;
/* 打开数据文件准备读*/
if(!f1.Open("channelmodel-result1.txt",CFile::modeRead))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //异常处理
#endif
}
for (ii=0;ii<SubslotNumber*FastFadingValueLength;ii++)
{
f1.ReadString(buf,100);
fFastFadingValue_1[ii]=(float)strtod(buf,&q);
}
f1.Close();
/* 打开数据文件准备读*/
if(!f1.Open("channelmodel-result2.txt",CFile::modeRead))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //异常处理
#endif
}
for (ii=0;ii<SubslotNumber*FastFadingValueLength;ii++)
{
f1.ReadString(buf,100);
fFastFadingValue_2[ii]=(float)strtod(buf,&q);
}
f1.Close();
/* 打开数据文件准备读*/
if(!f1.Open("channelmodel-result3.txt",CFile::modeRead))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //异常处理
#endif
}
for (ii=0;ii<SubslotNumber*FastFadingValueLength;ii++)
{
f1.ReadString(buf,100);
fFastFadingValue_3[ii]=(float)strtod(buf,&q);
}
f1.Close();
/* 打开数据文件准备读*/
if(!f1.Open("channelmodel-result4.txt",CFile::modeRead))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //异常处理
#endif
}
for (ii=0;ii<SubslotNumber*FastFadingValueLength;ii++)
{
f1.ReadString(buf,100);
fFastFadingValue_4[ii]=(float)strtod(buf,&q);
}
f1.Close();
/* 打开数据文件准备读*/
if(!f1.Open("channelmodel-result5.txt",CFile::modeRead))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //异常处理
#endif
}
for (ii=0;ii<SubslotNumber*FastFadingValueLength;ii++)
{
f1.ReadString(buf,100);
fFastFadingValue_5[ii]=(float)strtod(buf,&q);
}
f1.Close();
}
//////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////
void CNetworkDrive::CheckTheInputs()
{
ASSERT(m_iDropNum>0);
ASSERT(m_iSlotNum>0);
ASSERT(m_ServiceArea.GetSiteDistance()>0);
ASSERT((m_ServiceArea.GetOrthogonalFactor()>0)&&
(m_ServiceArea.GetOrthogonalFactor()<=1));
ASSERT(m_MsManager.GetVoiceNumPerSector()>=0);
ASSERT(m_MsManager.GetDataNumPerSector()>=0);
ASSERT((m_MsManager.GetFractionHttp()>=0)&&
(m_MsManager.GetFractionHttp()<=1));
ASSERT((m_MsManager.GetFractionFtp()>=0)&&
(m_MsManager.GetFractionFtp()<=1));
// ASSERT(m_MsManager.GetFractionFtp()+m_MsManager.GetFractionHttp()<=1.0000000001);
ASSERT(m_MsManager.m_iActiveSetMaxSize>0);
ASSERT(m_MsManager.m_fPowerControlStep>0);
ASSERT(m_MsManager.m_iSoftHandoffDelay>-1);
ASSERT(m_MsManager.m_fC2IThreshold>-100);
ASSERT(m_MsManager.m_fC2ITarget>-100);
ASSERT((m_MsManager.m_fMaxFractionOfTrafficPower>0)&&
(m_MsManager.m_fMaxFractionOfTrafficPower<1));
ASSERT(m_MsManager.m_fDynamicRangeOfTrafficPower>0);
ASSERT((m_MsManager.m_fBEROfPC>=0)&&(m_MsManager.m_fBEROfPC<=1));
ASSERT(m_MsManager.m_iMaxTransmissionNum>0);
ASSERT(m_MsManager.m_iCellSwitchDelay>0);
ASSERT((m_MsManager.m_fErrorRateOfFeedBack>=0)&&
(m_MsManager.m_fErrorRateOfFeedBack<=1));
ASSERT(m_MsManager.m_fAlpha>0);
ASSERT(m_MsManager.m_fK>0);
ASSERT(m_MsManager.m_iMaxDataBitsNum>0);
ASSERT(m_MsManager.m_fMeanIntervalOfPacketCall);
}
//////////////////////////////////////////////////////////////////////////
//
// TITLE: Drop初始化函数
//
// PURPOSE:完成一个drop内的基站和移动台的初始化。
//
// SAMPLE CALL:
// CNetworkDrive mysystem;
// mysystem.SystemInitialization();
// ...
// <in a function of the class CNetworkDrive>
// for (m_iDropCurrentNum=0;m_iDropCurrentNum<6;
// m_iDropCurrentNum++)
// DropInitialization();
//
// AUTHOR: Ouyang Hui
//
// DATE: 01/04/04
//
// CALLED BY FUNCTIONS:
// CNetworkDrive::SimulationRun()
//
// CALLING FUNCTIONS:
// CMsManager::MsInitialization()
//
// MODIFICATION SINCE 01/04/04:
//
///////////////////////////////////////////////////////////////////////////
void CNetworkDrive::DropInitialization()
{
cout<<"Drop "<<m_iDropCurrentNum<<" initialization..."<<endl;
//initialize the class CServiceArea
m_ServiceArea.Initialization(m_iSlotNum);
m_MsManager.MsInitialization(&m_ServiceArea);
m_ServiceArea.PacketChannelPower();
}
//////////////////////////////////////////////////////////////////////////
//
// TITLE: 仿真流程主函数
//
// PURPOSE: 调用系统初始花函数,开始drop循环,调用drop初始化函数,
// 开始时间循环,调用时隙仿真函数,调用数据统计函数,等。
//
// SAMPLE CALL:
// CNetworkDrive mysystem;
// mysystem.Simulation;
//
// NOTE: This is the main function in the whole program
//
// CALLING FUNCTIONS:
// CNetworkDrive::SystemInitialization()
// CNetworkDrive::DropInitialization()
// CNetworkDrive::SlotRun()
// CServiceArea::PortionOfBsOutrage()
// CNetworkDrive::DataStatics()
//
// AUTHOR: Ouyang Hui
//
// DATE: 01/04/04
//
// MODIFICATION SINCE 01/04/04:
//
//////////////////////////////////////////////////////////////////////////
void CNetworkDrive::SimulationRun()
{
//设置仿真参数,初始化驱动与网络功能模块的必要参数
SystemInitialization();
//开始snap-shot循环
for ( m_iDropCurrentNum=1;m_iDropCurrentNum<=m_iDropNum;
m_iDropCurrentNum++)
{
//创建移动台队列
m_MsManager.AddUser();
//移动台管理与数据统计模块控制创建一定数量的移动台模块,
//完成移动台初始化过程,插入对应的移动台模块队列。
DropInitialization();
//开始时间驱动仿真循环
for (m_iSlotCurrentNum=1;m_iSlotCurrentNum<=m_iSlotNum;
m_iSlotCurrentNum++)
SlotRun();
m_ServiceArea.PortionOfBsOutrage(m_iDropCurrentNum);
m_MsManager.DataBitsAndPacketCumulate();
m_ServiceArea.SectorStatics();
DataStatics();
//清除移动台队列
m_MsManager.Clean();
for(int i=0;i<SectorNumber;i++)
{
m_ServiceArea.m_aCellArray[2][2].m_aSectorInCell[i].m_iNumOfSector=0;
m_MsManager.m_iDataNumGenerated[i]=0;
//...... added by cqm, Apr.9 ......//
m_MsManager.m_iVoiceNumGenerated[i]=0; //每扇区已经生成的话音用户数清零
//.................................//
}
}
}
//////////////////////////////////////////////////////////////////////////
//
// TITLE: 时隙仿真函数
//
// PURPOSE:调用CmsManager中的函数完成话音用户的循环,调用CserviceArea
// 中的函数完成分组信道功率的计算,调用CmsManager中的函数完成数据用
// 户的处理,调用CserviceArea和CmsManager中的函数完成数据传输和服务
// 质量评估。
//
// SAMPLE CALL:
// CNetworkDrive mysystem;
// ...
// <in a function of the class CNetworkDrive>
// for (m_iDropCurrentNum=0;m_iDropCurrentNum<6;
// m_iDropCurrentNum++)
// for (m_iSlotCurrentNum=0;m_iSlotCurrentNum<6;
// m_iSlotCurrentNum++)
// mysystem.SlotRun();
//
// CALLED BY FUNCTIONS:
// CNetworkDrive::SimulationRun()
//
// CALLING FUNCTIONS:
// CServiceArea::SystemReset()
// CMsManager::VoiceProcess()
// CServiceArea::PacketChannelPower()
// CMsManager::DataProcess()
// CServiceArea::DataTransmission()
// CMsManager::MsThroughputStatistics() (Removed)
// CMsManager::MsC2IStatistics()
//
// AUTHOR: Ouyang Hui
//
// DATE: 01/04/04
//
// MODIFICATIONS SINCE 01/04/04
//
////////////////////////////////////////////////////////////////////////////
void CNetworkDrive::SlotRun()
{
//测试用程序段,表明程序进程
if (m_iSlotCurrentNum%80==0)
cout<<"Now is in drop "<<m_iDropCurrentNum
<<" of "<<m_iDropNum
<<" and slot "<<m_iSlotCurrentNum
<<" of "<<m_iSlotNum<<endl;
if (m_iSlotCurrentNum==784)
cout<<"wait"<<endl;
//调用CSECTOR中的功率复位函数
// m_ServiceArea.SystemReset();
m_MsManager.m_iSlotCurrentNum=m_iSlotCurrentNum;
m_MsManager.m_iDropCurrentNum=m_iDropCurrentNum;
//循环处理话音业务移动台,计算服务质量,更新衰落值和切换状态,进行功率控制。
m_MsManager.VoiceProcess();
//对所有BTS模块进行循环,计算除去话音用户之外,剩余的分组数据信道功率
// m_ServiceArea.PacketChannelPower();
///// Modified by oyh on 20010508 ///////////////////////////////////
m_ServiceArea.SystemReset();
m_MsManager.UpdateSectorPower(); //更新各扇区话音功率
//对所有BTS模块进行循环,计算除去话音用户之外,剩余的分组数据信道功率
m_ServiceArea.PacketChannelPower();
/////////////////////////////////////////////////////////////////////
//循环处理数据业务移动台,根据对应最佳扇区的分组数据信道功率
//计算适合的数据传输速率,并统计各个扇区对应的优先级最高者,
//做出相应标记。然后,更新衰落值和最佳扇区。
m_MsManager.DataProcess();
//// Added by oyh on 20010514 ////////////////////////////////////
m_ServiceArea.UpdatePacketPower(); //更新各扇区数据用户总功率
m_ServiceArea.TxPower(); //更新各扇区总功率
m_MsManager.UpdateSetPower(); //更新各移动台相邻集及候选集功率
//////////////////////////////////////////////////////////////////
//对所有BTS模块进行循环,模拟数据用户的数据传输,利用链路级模块评估服务质量。
m_ServiceArea.DataTransmission (m_iSlotCurrentNum);
if (m_iSlotCurrentNum>INITIALSLOT)
m_ServiceArea.TotalBsOutrageCalcute();
/*
if ((m_iSlotCurrentNum==(int)(m_iSlotNum*0.2))||
(m_iSlotCurrentNum==(int)(m_iSlotNum*0.4))||
(m_iSlotCurrentNum==(int)(m_iSlotNum*0.6))||
(m_iSlotCurrentNum==(int)(m_iSlotNum*0.8))||
(m_iSlotCurrentNum==m_iSlotNum)||
(m_iSlotCurrentNum==m_iDataStaticsSlotNum))
m_MsManager.MsC2IStatistics();
*/
}
//////////////////////////////////////////////////////////////////////////
//
// TITLE: 数据统计函数
//
// PURPOSE:完成所有的数据统计,包括调用CMsManager中的函数统计与移动台有关的
// 数据,调用CServiceArea中的函数
//
// SAMPLE CALL:
// CNetworkDrive mysystem;
// ...
// mysystem.DataProcess();
//
// CALLED BY FUNCITONS:
// CNetworkDrive::SimulationRun()
//
// CALLING FUNCTIONS:
// CMsManager::MsThroughputStatistics()
// CMsManager::VoiceStatistics()
// CMsManager::MeanThroughputStatistics()
// CMsManager::MeanPERStatistics()
//
// AUTHOR: Ouyang Hui
//
// DATE: 01/04/04
//
// MODIFICATIONS SINCE 01/04/04:
//
///////////////////////////////////////////////////////////////////////////
void CNetworkDrive::DataStatics()
{
m_MsManager.VoiceStatistics();
m_MsManager.MeanThroughputStatistics();
m_MsManager.MeanPERStatistics();
m_MsManager.MsThroughputStatistics();
//zdy
m_MsManager.MsDelayStatistics();
}
////////////////////////////////////////////////////////
//各类接口函数
int CNetworkDrive::GetDropCurrentNum() //获取当前drop序号
{
return m_iDropCurrentNum;
}
void CNetworkDrive::SetDropCurrentNum(int ip) //设置当前drop序号
{
m_iDropCurrentNum=ip;
}
int CNetworkDrive::GetSlotCurrentNum() //获取当前时隙序号
{
return m_iSlotCurrentNum;
}
void CNetworkDrive::SetSlotCurrentNum(int ip) //设置当前时隙序号
{
m_iSlotCurrentNum=ip;
}
int CNetworkDrive::GetDataStaticsDropNum() //获取数据采集的drop号
{
return m_iDataStaticsDropNum;
}
int CNetworkDrive::GetDataStaticsSlotNum() //获取数据采集的时隙号
{
return m_iDataStaticsSlotNum;
}
int CNetworkDrive::GetStaticsFileNum()
//获取数据统计用文件个数
{
return m_iStaticsFileNum;
}
void CNetworkDrive::SetDataStaticsDropNum(int ip)
//设置数据采集的drop号
{
m_iDataStaticsDropNum=ip;
}
void CNetworkDrive::SetDataStaticsSlotNum(int ip)
//设置数据采集的时隙号
{
m_iDataStaticsSlotNum=ip;
}
void CNetworkDrive::SetStaticsFileNum(int ip)
//设置数据统计用文件个数
{
m_iStaticsFileNum=ip;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -