📄 cnetworkdrive.cpp
字号:
#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("wchannelmodel-resultE.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();
}
//zl 20060329
void CNetworkDrive::ReadData_VideoPacketValue()
{
CStdioFile f1; //定义一个I/O文件对象
char buf[100];
int ii;
char* q;
/* 打开数据文件准备读*/
if(!f1.Open("MPEG4_trace.txt",CFile::modeRead))
{
#ifdef _DEBUG
afxDump<<"Unable to open file"<<"\n"; //异常处理
#endif
}
for (ii=0;ii<36000;ii++)
{
f1.ReadString(buf,100);
iVideoPacketSize[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);
//slj 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;
m_ServiceArea.Initialization(m_iSlotNum,m_fTimePerDrop);
m_MsManager.MsInitialization(&m_ServiceArea);
cout<<"Initialization:\n";
m_ServiceArea.OutputSectorPower();
}
//////////////////////////////////////////////////////////////////////////
//
// 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()
{
cout<<"The function CNetworkDrive::SystemInitialization() is being called!\n";
//设置仿真参数,初始化驱动与网络功能模块的必要参数
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.DataBitAndPacketCumulate();
//累计服务区环境中各个扇区的统计量
m_ServiceArea.SectorStatics();
//计算统计量并将数据输出统计
DataStaticsAndOutput();
//输出扇区平均发射功率
m_ServiceArea.AvePowerOutput();
//清除移动台队列
m_MsManager.Clean();
//清除相关统计量
m_MsManager.StatisticsReset();
}
}
//////////////////////////////////////////////////////////////////////////
//
// 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()
{
m_ServiceArea.TTINumAddOne();//wlm
//测试用程序段,表明程序进程
if(m_iSlotCurrentNum%100==0)
cout<<"Now is in drop "<<m_iDropCurrentNum
<<" of "<<m_iDropNum
<<" and slot "<<m_iSlotCurrentNum
<<" of "<<m_iSlotNum<<endl;
m_MsManager.m_iSlotCurrentNum=m_iSlotCurrentNum;
m_MsManager.m_iDropCurrentNum=m_iDropCurrentNum;
/*
if(m_iSlotCurrentNum==700)
{
cout<<"stop"<<endl;
}
*/
//循环处理话音业务移动台,计算服务质量,更新衰落值和切换状态,进行功率控制
//m_MsManager.VoiceProcess();
////计算服务区环境中各个扇区DCH信道数据用户可用功率
m_ServiceArea.DCHAvailablePowerCalculate();
////对DCH数据移动台队列进行处理
m_MsManager.DCHDataMsListProcess();
////完成接纳控制成功的DCH信道数据移动台的软切换、功率控制和数据传输
m_MsManager.DCHMsListProcess();
////计算服务区环境中各个扇区HSDSCH信道数据用户的可用功率
//by zl
m_ServiceArea.HSDSCHAvailablePowerCalculate(); //20050428
if(m_iSlotCurrentNum%3==1)
{
if(DelayedSlot>0 && IsPredict==true)
m_MsManager.UpdatePredictionQueue();
}
////对HSDSCH数据移动台队列进行处理,调度
if (m_ServiceArea.GetTTINum() %3 == 1)//wlm 060223 第一子时隙时,或调度成功时
{
m_MsManager.HSDSCHDataListProcess();
}
else
{
m_MsManager.FillQueue(); //zl 20060404
}
//20051223
if(m_iSlotCurrentNum%3!=1)
m_MsManager.UserC2ICalculate();
if(m_iSlotCurrentNum%3==0)
{
m_MsManager.UserMeanC2ICalculate();
if(DelayedSlot>0 && IsPredict==false)
m_MsManager.UpdateDelayedQueue();
}
////完成各个扇区HSDSCH信道用户队列中用户的子信道分配、数据传输、统计
//by zl
if(m_ServiceArea.GetTTINum()%3 == 1)//wlm 060223 第一子时隙时,或调度成功时
{
m_ServiceArea.HSDSCHProcess();
/*
//20051228
if(m_iSlotCurrentNum%3==0)
{
if(DelayedSlot>0 && IsPredict==false)
m_MsManager.UpdateDelayedQueue();
}*/
////基站处理反馈信息
//by zl
m_MsManager.FeedbackProcess();
//by zl 20050511
// m_MsManager.MeanIor2Ioc();
////更新扇区总的发射功率
m_ServiceArea.TxPower();
// m_MsManager.OutPutThreshold();
if(m_iSlotCurrentNum%100==0)
{
m_ServiceArea.OutputSectorPower();
m_ServiceArea.CalculateAveragePower();
}
if(m_iSlotCurrentNum%750==0)
{
m_MsManager.Coverage();
}
//m_ServiceArea.SectorPowerToFile(m_iSlotCurrentNum);
////更新各个移动台监测集信息
m_MsManager.UpdateSetPower(); //更新各移动台监测集功率
//////////////////////////////////////////////////////////////////
if (m_iSlotCurrentNum>INITIALSLOT)
m_MsManager.SectorStaticsCumulate();
}
//zl 20060302
if(m_iSlotCurrentNum%3==0)
{
m_MsManager.DropVideoPacket();
m_MsManager.DelaytoDrop();
}
/*
if(m_iSlotCurrentNum>INITIALSLOT&&m_iSlotCurrentNum%3==0)
{
m_MsManager.UpdateWFactor();
}*/
}
//////////////////////////////////////////////////////////////////////////
//
// 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::DataStaticsAndOutput()
{
//for compile 目前只考察数据移动台
m_MsManager.VoiceStatistics();
m_MsManager.DataMsStatisticsCalculate();
m_MsManager.MeanThroughputStatistics();
m_MsManager.MsThroughputStatistics();
m_MsManager.MsFairnessStatistics(); //20051205
// m_MsManager.MaxRatioThrStatistics(); //20051205
m_MsManager.VideoDropRatioStatistics(); //zl 20060302
m_MsManager.VideoPacketDropRatioStatistics(); //zl 20060328
// m_MsManager.MsASTStatistics();
// m_MsManager.MsDelayStatistics();
// m_MsManager.DCHMsDropRatio();
}
////////////////////////////////////////////////////////
//各类接口函数
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 + -