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

📄 layer0.cpp

📁 topdisc算法的omnet仿真.平台:omnet+vc 6.0
💻 CPP
字号:
//-------------------------------------------------------------------
//  file name: layer0.cpp
// 
//    - contains the implementation of layer0 class
//
//-------------------------------------------------------------------


#include "layer0.h"
#include <cQueue.h>
#include <string.h>
#include <cObject.h>

void layer0::initialize()
{
	for(int i=0;i<NNODES;i++)
		data[i]=0;
}

void layer0::finish(){/*	int type=parentModule()->par("TYPE");	if(type==1)	{		ev<<"cluster head node:"<<ID<<"   other nodes :    ";		for(int i=0;i<NNODES;i++)		{			if(data[i]==1)				ev<<i<<"      ";		}		ev<<endl;	}*/}
void layer0::activity()
{
	// main loop
	while(1)
	{
		if(ID==0)
			UPDATECOLOR(7);

		cMessage *msg=receive();		
		
  		switch (msg->kind())
		{
		case M_NODE:					// message from another node
			{
				//compute the nodes's distance
				int senderPX=msg->par("senderPX");
				int senderPY=msg->par("senderPY");
				int arrivalPX=this->parentModule()->par("PX");
				int arrivalPY=this->parentModule()->par("PY");

				int dis=(senderPX-arrivalPX)*(senderPX-arrivalPX)+(senderPY-arrivalPY)*(senderPY-arrivalPY);
				if(dis==0)
				{
					ev<<"node "<<msg->par("senderId")<<"  and node "<<ID<<" is in the same position!"<<endl;
					dis=1;
				}

				//set timeout
				simtime_t timeout=400000/dis;
				msg->addPar("timeout")=timeout;
				msg->setKind(M_LOWHIGH);

				//transmitte black node's request
				if(strcmp(msg->name(),"BlackRequest")==0)
					send(msg,"uppergate_out");


				//transmitte grey node's request
				else if (strcmp(msg->name(),"GreyRequest")==0)
				{
					int type=parentModule()->par("TYPE");
					if(type==-1)
					{
						cQueue queue;
						waitAndEnqueue(timeout,&queue);

						cObject *m=queue.findObject("BlackRequest");
						if(m!=NULL)
							parentModule()->par("TYPE")=2;
	
						queue.clear();
					    send(msg,"uppergate_out");
					}
					else 
						send(msg,"uppergate_out");

				}
			}
			break;

		case M_HIGHLOW:					// message from a higher layer
			{
				msg->setKind(M_NODE);

				// duplicate the message and send it through all the gates
				for (int i=0;i<NNODES;i++)
				{
					cGate *tmpgate = parentModule()->gate("out",i);
					
					if (tmpgate==NULL)
						continue;

					// if gate is connected, send a message through it
					if (tmpgate->toGate()!=NULL)
					{
						cMessage *tmpmsg = new cMessage(*msg);

						send(tmpmsg,"lowergate_out",i);

						cGate *gate=tmpgate->toGate();
						cModule *mod=gate->ownerModule();
						int id=mod->index();
						data[id]=1;
					}
				}

				// delete original message
				delete msg;
			}
			break;

			
		default:						// unknown message received - bug!. 
			ev << "layer0::activity() error: unknow message received\n";
			endSimulation();
		}
	}
}

⌨️ 快捷键说明

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