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

📄 cnetworkdrive.cpp

📁 这是cdma2000的一个分组调度算法实例
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -