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

📄 asyncappllayer.cc

📁 基于omnet++开发的Mf框架下的802.11协议仿真。
💻 CC
📖 第 1 页 / 共 3 页
字号:
	  	std::string::size_type pos = 0, prev_pos = 0;
	  	unsigned int index=0;
	  	double data1[8];
	  	double data;
	  	while (( pos = s.find_first_of( ' ', pos ))!= std::string::npos )
	  	{
	   		//++pos;
       	pos = s.find_first_of(' ',pos);
	      if(s.substr(prev_pos, pos-prev_pos)=="")//如果等于空字符串,继续查找	      {
	      	prev_pos=++pos;
	        continue;
        } 
        else
        {
        	data = atof(s.substr(prev_pos, pos - prev_pos).c_str());//?
        	data1[index++]=data;
        	prev_pos = ++pos;
        }	
      }	  
			data=atof(s.substr(prev_pos,pos - prev_pos).c_str());				 
			data1[index]=data;
  			
      std::cout<<endl;
      std::cout<<endl;
      std::cout<<"generate a Packet !!!!!!!!!!"<<endl;
      std::cout<<"data1=";
      for (int i=0;i<8;i++)
      {
       	std::cout<<data1[i]<<",";
      }
      std::cout<<"."<<endl;  
	  
			double dec[8];
			int h=8;
			while(h>1)
			{
        h=h/2;
        for (int i=0;i<h;i++)
        {
          dec[i] = ((data1[2*i]+data1[2*i+1]));
          dec[h+i] =((data1[2*i]-data1[2*i+1]));
        }
        for(int i=0;i<(2*h);i++)
        {
          data1[i]=dec[i];	
        } 
      }
        
      std::cout<<"dec=";
      for (int i=0;i<7;i++)
      {
       	std::cout<<dec[i]<<",";
      }
      std::cout<<dec[7]<<"."<<endl;;
      
    
			for(int i=0;i<8;i++)
			{ 
				ev<<"*"<<endl;
				pk->setData(i,data1[i]);				
			}
				
	/**###################################################*/
	               /** 数据报设置*/
	     ev<<"?????????????????????"<<endl;
       pk->setSrcAddr(myApplAddr());
       pk->setDestAddr(destModuleID);
       pk->setLength(headerLength);
       pk->setTimestamp(simTime()); 
       pk->setSeqNum1(row);//4-12添加       row++;
      // std::cout<<"aaa"<<std::endl;
       ev<<logName()<<"::AsyncApplLayer:: the pk's timestamp=="<<pk->timestamp()<<endl;  
             
       sendDown(pk);
	
		   if (ev.isGUI()) 
		    	parentModule()->bubble("Generating packet...");    	
       numBurstMessage++;
       EV <<" generating packet to " <<destAddress<< "#" << numBurstMessage <<endl;
       scheduleAt(simTime()+(double)par("iaitime"), generatePacket);          
    }  
    
    else if(msg==clusterWaveLet)//时钟信号控制,强制进行小波变换    {
    	  std::cout<<"强制进行小波变换"<<std::endl;
        do_clusterWave();
    }
    /***************add by zhutiejun 4-25 **********************/
    else if(msg==undoCode)  //时钟信号控制,强制进行解码
    {
    	//判断哪个簇的数据报已经过半
    	  //最后一个数据报的到达时间矩现在是否已经达到门限值
    	  //是,则将这些数据报取出,按包号排列,取出数据,在丢包处进行插值,生成一个队列,调用解码函数
    	std::cout<<endl;
    	std::cout<<"The signal of undocode................"<<endl;
    	std::cout<<"the size of dmap is:"<<dmap.size()<<endl;
    	m_iterator it_begin=dmap.begin();
    	//m_iterator it_end=dmap.end();
    	simtime_t t=simTime();
    	
    	for(;it_begin!=dmap.end();)
    	{
    		std::cout<<endl;
    		std::cout<<((*it_begin).second.size())<<"——————"<<((*it_begin).second.front())->getSeqNum1()<<endl;
    		if(static_cast<double>((*it_begin).second.size())/((*it_begin).second.front())->getSeqNum1()>0.5)
     	  {
     	  		//(*m_it).second.back()->setTimestamp(simTime());
     	  		if(t-(*it_begin).second.back()->timestamp()>=100||static_cast<double>((*it_begin).second.size())/((*it_begin).second.front())->getSeqNum1()==1.0)
     	  		{
     	  			std::ofstream fout( "dataSize.txt", std::ios_base::app );
     	  			std::cout<<endl;
     	  			std::cout<<"unDo_Coding........................"<<endl;
     	  			std::deque<ApplPkt*> msgqueue;
     	  			msgqueue=(*it_begin).second;
     	  			
     	  			fout<<"begin sort msgqueue's size="<<msgqueue.size()<<endl;
     	  			
							sort(msgqueue.begin(),msgqueue.end(),Comp());  //按照第2个序列号排序
							
							fout<<"after sort msgqueue's size="<<msgqueue.size()<<endl;
							
							std::deque<ApplPkt*> ::iterator de_iterator=msgqueue.begin();
								
							
							int count=(*de_iterator)->getSeqNum1();
							std::cout<<"count="<<count<<endl;
							fout<<"totalCount="<<count<<endl;
							for(int i=0;i<(count-4);++i)//数据   有问题,如果地址没有收满,那么有一个或几个地址会当成数据
							{ 
								//std::cout<<"*******"<<endl;//测试点
																
								if((de_iterator!=msgqueue.end())&&(i+1)==((*de_iterator)->getSeqNum2()))
								{
									//std::cout<<((*de_iterator)->getSeqNum2())<<endl;//测试点
									adr=(*de_iterator)->getSrcAddr();
									for(int j=0;j<8;++j)
									{
										dataQueue1.push_back((*de_iterator)->getData(j));
									}
									++de_iterator;
								}
								else
								{
									std::cout<<endl;
									std::cout<<"chazhi...................."<<endl;
									for(int j=0;j<8;++j)
									   dataQueue1.push_back(1);
								}
							}
						/**************************************/	
							for(int i=0;i<4;++i)//原地址
							{ std::cout<<"*******"<<endl;//测试点
								
								if((de_iterator!=msgqueue.end())&&(((*de_iterator)->getSeqNum1())+i-3)==((*de_iterator)->getSeqNum2()))
								{
									std::cout<<((*de_iterator)->getSeqNum2())<<"--"<<((*de_iterator)->getSeqNum1())<<endl;//测试点
									for(int j=0;j<8;++j)
									{
										addr_sink[8*i+j]=(*de_iterator)->getData(j);
									}
									++de_iterator;
								}
								
							}
						/************************************/
						  //删除指针
						 // for_each(msgqueue.begin(),msgqueue.end(),DeleteObj<ApplPkt>);
						  for_each(msgqueue.begin(),msgqueue.end(),DeleteObj());
							std::cout<<endl;
							std::cout<<"addr_sink[32]="<<endl;
							for(int i=0;i<32;i++)
							{
								std::cout<<addr_sink[i];
							}
							std::cout<<endl;
							std::cout<<endl;
							std::cout<<"dataQueue1's size="<<dataQueue1.size()<<endl;
							cDataQueue dataQue;//临时变量
							std::cout<<endl;
							std::cout<<endl;
						  std::cout<<"jiema...................."<<endl;
							while(!dataQueue1.empty())
							{
								double d1;
								int size;
								d1=dataQueue1.front();
								std::cout<<"the size of dataQueue1 is :"<<dataQueue1.size();
								std::cout<<"  data="<<d1<<endl;
								dataQueue1.pop_front();
								size = dataQueue1.front();
								dataQueue1.pop_front();
								for(int si=0;si<size;++si)
								{
									dataQue.push_back(d1);
								}
							}
							
							std::cout<<endl;

					//		std::cout<<"dataQue's size="<<dataQue.size()<<endl;
							dataQueue1.assign(dataQue.begin(),dataQue.end());//队列赋值
							int dataSize=dataQueue1.size();
							
						//	std::cout<<"dataSize="<<dataSize<<std::endl;
							fout<<"dataSize="<<dataSize<<std::endl;
								
							for(int ii=0;ii<256-dataSize;++ii)
							{
								dataQueue1.push_back(0);
							}							
							
							fout<<"begin erase,the dmap's size="<<dmap.size()<<endl<<endl;
							dmap.erase(it_begin++);
							fout<<"after erase,the dmap's size="<<dmap.size()<<endl<<endl;
							fout.close();
							unDo_code();
     	  		}
     	  		else
     	  			++it_begin;
     	  		//scheduleAt(simTime()+200,overtimeMsg);
     	  }
     	  else 
     	  	++it_begin;
    	}
    	scheduleAt(simTime()+5.0,undoCode);
    }
    /*************************end ******************************/
    
    else if(numBurstMessage>=maxNumBurst)
   		EV << " source stopped bursting!!! " << endl;   		
   	
}


/** @brief 簇头小波变换4.19添加*/
void AsyncApplLayer::do_clusterWave()
{
   
    /************将32个数据的相关信心拷贝到addr数组和clusterHead_data中***************/
    clu_iterator iterBegin = cluData.begin();
    clu_iterator iterEnd = cluData.end();
    int subscript=0;
    while( iterBegin != iterEnd)
    {
    	addr[subscript]=iterBegin->first;
    	std::deque<double> dQue=iterBegin->second;
    	for(int i=0;i<8;i++)
    	  clusterHead_data[subscript][i]=dQue[i];
    	++subscript;
    	++iterBegin;
    }
    cluData.clear(); 	
        	
    /***************************end*******************************/
   
   //3级小波列变换   //调用编码函数   std::cout<<"The clusterHead begin to wavelet!!!!!!!"<<endl;
   std::cout<<"#########################################"<<endl;
   std::cout<<"old data is:"<<endl;
    //打印数据
  
  	for(int i=0;i<32;i++)
    {
     	for(int j=0;j<8;j++)
      {
        std::cout<<clusterHead_data[i][j]<<" ";
        test_data[i][j]=clusterHead_data[i][j];// For testing (temp) 5.11
      }
      std::cout<<endl;
    }
    std::cout<<endl;
    std::cout<<endl;
   
   
   for(int j=0;j<8;j++)
   {
   	  double temp[32];
      int h=8;//三级变换      while(h>1)
      {        
        h=h/2;
        for(int i=0;i<4*h;i++)
        {
          temp[i]=(clusterHead_data[2*i][j]+clusterHead_data[2*i+1][j]);
          temp[4*h+i]=(clusterHead_data[2*i][j]-clusterHead_data[2*i+1][j]);		
        }
        for(int i=0;i<(8*h);i++)
        {
          clusterHead_data[i][j]=temp[i];	
        }
      }
   }
   
   std::cout<<"#########################################"<<endl;
  
   std::cout<<"new data is:"<<endl;
     //打印数据
  
  	for(int i=0;i<32;i++)
     {
     	for(int j=0;j<8;j++)
        {
        	std::cout<<clusterHead_data[i][j]<<" ";
        }
        std::cout<<endl;
     }
     std::cout<<endl;
     std::cout<<endl;
  
     //小波变换后对数据进行量化
     std::cout<<"量化数据:"<<endl;
     for(int i=0;i<32;i++)
       for(int j=0;j<8;j++)
       {
         if(fabs(clusterHead_data[i][j])<(double)par("limit"))
             clusterHead_data[i][j]=0.0;
       }
      //打印数据
  
  	for(int i=0;i<32;i++)
    {
     	for(int j=0;j<8;j++)
      {
        	std::cout<<clusterHead_data[i][j]<<" ";
      }
      std::cout<<endl;
    }
    std::cout<<endl;
    std::cout<<endl;
     
    test();//测试,计算mse   
    
     //接下来调用编码函数
    std::cout<<"begin to do_code!!!!!!!!"<<endl;    do_code();

}


/** @brief 簇头压缩编码 -4.19添加*/
void AsyncApplLayer::do_code()
{
    
       //朱铁军负责编写
    /*******************zhu tiejun 4-25****************
       Z型编码******/
    cDataQueue temp;
   /********************modify by zhu tiejun 5-10************/
    int former_row=0;
    int behind_row=4;
    int former_col=0;
    int behind_col=1;
    while(former_col<8)
    {
    	for(int row=0;row<former_row;++row)
    	{
    	 for(int col=former_col;col<behind_col;++col)
    	 {
    	 	 if(temp.empty()||clusterHead_data[row][col]==temp.front())
    	 	 	temp.push_back(clusterHead_data[row][col]);
    	 	 

⌨️ 快捷键说明

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