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

📄 commctl.cpp

📁 cdma-cd的VC++源代码cdma-cd的VC++源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Commctl.cpp : implementation file
//

#include "stdafx.h"
#include "csma_cd.h"
#include "Commctl.h"

#include <math.h>
#include <assert.h>
#include <process.h>
#include <time.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

const int IDLE = 0;
const int CARRIER_SENSE = 1;
const int TRANSMIT = 2;
const int BACKOFF = 3;

//////////////////////////////////////////////////////////////////////
// Counter class Construction/Destruction
//////////////////////////////////////////////////////////////////////

Counter::Counter( int start ) 
{
    myCount = start;
}

Counter::Counter(void)
{
	myCount = 0;
}

Counter::~Counter(void)
{

}

void Counter::decrement() 
{
	myCount--;
}

void Counter::increment() 
{
    myCount++;
}

int Counter::getCount() 
{
    return myCount;
}

void Counter::setCount(int count) 
{
    myCount = count;
}

//////////////////////////////////////////////////////////////////////
// Counter class Construction/Destruction
//////////////////////////////////////////////////////////////////////

Part::Part( int start, int end, int offset, int frameSize, Medium* medium ) 
{
    myStart = start;
    myEnd = end;
    myOffset = offset;
    myCollisionFlag = FALSE;
    myMaxFrameSize = frameSize;
    m_pMyMedium = medium;
    myLength = 0;
    myDoneFlag = FALSE;
}

void Part::setCollisionFlag( BOOL flag ) 
{
    myCollisionFlag = flag;
}

BOOL Part::getCollisionFlag() 
{
	return myCollisionFlag;
}

BOOL Part::getDoneFlag() 
{
    return myDoneFlag;
}

int Part::getStart() 
{
    return myStart;
}

int Part::getEnd() 
{
    return myEnd;
}

BOOL Part::isSent() 
{
    return (myLength > myMaxFrameSize);
}

void Part::update() 
{
    if (myLength>0 && myStart==myEnd) 
    {
		myDoneFlag=TRUE;
		return;
    }

    myLength = myLength + abs(myOffset);
    myStart = myStart + myOffset;
    if ( myLength > myMaxFrameSize )
		myEnd = myEnd + myOffset;

    if (myStart<0) 
		myStart = 0;

    if (myStart>m_pMyMedium->getBusLength())//ACTULLY buslength=100
		myStart = m_pMyMedium->getBusLength();

    if (myEnd<0) 
		myEnd = 0;

    if (myEnd>m_pMyMedium->getBusLength())
		myEnd = m_pMyMedium->getBusLength();
}

//////////////////////////////////////////////////////////////////////
// Medium class Construction/Destruction
//////////////////////////////////////////////////////////////////////

Medium::Medium() 
{
	myBusLength = 100;// in meters
	for ( int i=0; i<MAX_SIGNALS; i++ )
	{
		mySignals[i] = NULL;
	}
}

Medium::~Medium()
{
	for ( int i=0; i<MAX_SIGNALS; i++ )
	{
		if ( NULL != mySignals[i] )
		{
			delete mySignals[i];
			mySignals[i] = NULL;
		}
	}
}

BOOL Medium::isInInterval(int value, int start, int end) 
{
//    if ( (value >= __min(start,end))&&(value <= __max(start,end)) )
    if ( (value > __min(start,end))&&(value < __max(start,end)) )
		return TRUE;
    else
		return FALSE;
}

void Medium::setMediumIdle()
{
 	for(int j=0;j<MAX_SIGNALS;j++)
		if(mySignals[j]!=NULL)
		 	mySignals[j]->setIdle();
}	

int Medium::getBusLength()
{
    return myBusLength;
}

Signal** Medium::getSignals() 
{
	return mySignals;
}

BOOL Medium::isCollision(int station, int position) 
{
	int index;

	for ( index=0; index<MAX_SIGNALS; index++ ) 
	{
		if ( (mySignals[index] != NULL) && (mySignals[index]->getStationId()!=station) ) 
		{
			if ( isInInterval( position, mySignals[index]->getLeftPart()->getStart(), 
				mySignals[index]->getLeftPart()->getEnd() ) ) 
			{
				if ( mySignals[index]->getLeftPart()->getCollisionFlag() == TRUE ) 
				{
					return TRUE;
				}
			}

			if ( isInInterval( position, mySignals[index]->getRightPart()->getStart(),
				mySignals[index]->getRightPart()->getEnd() ) )
			{
				if ( mySignals[index]->getRightPart()->getCollisionFlag() == TRUE ) 
				{
					return TRUE;
				}
			}        
		}
	}

	return FALSE;
}

BOOL Medium::isFree(int position)
{
    int index;

    for ( index=0; index<MAX_SIGNALS; index++ )
	{
		if ( mySignals[index] != NULL )
		{
			if ( isInInterval( position, mySignals[index]->getLeftPart()->getStart(), 
					mySignals[index]->getLeftPart()->getEnd() ) )
			{
				return FALSE;
			}

			if ( isInInterval( position, mySignals[index]->getRightPart()->getStart(), 
			   mySignals[index]->getRightPart()->getEnd() ) )
			{
				return FALSE;
			}

//			return TRUE;//chh
		}
    }

    return TRUE;
}

void Medium::sleep(int time)
{
	::Sleep(time);
}

BOOL Medium::send( int station, int position, int frameSize)
{
    int index;

    for ( index=0; index<MAX_SIGNALS; index++ )
	{
		if ( mySignals[index] == NULL )
		{
			mySignals[index] = new Signal( station, position, frameSize, this);
			while(TRUE) 
			{
				if ( mySignals[index]->isSent() )
				{
					return TRUE;
				}          

				if ( isCollision(station, position) )
				{
					return FALSE;
				}          

				sleep(50);
			}
		}
    }

    return FALSE;
}

void Medium::update()
{
    int i,j; 
    int start,end, id;

    // update signals
    for ( i=0; i<MAX_SIGNALS; i++ )
	{
		if ( mySignals[i] != NULL )
		{     
			mySignals[i]->update();
			if ( mySignals[i]->isDone() )
			{
				delete mySignals[i];
				mySignals[i] = NULL;
			}
		}
    }

    // find collisions
    for ( i=0; i<MAX_SIGNALS; i++ )
	{
		if ( mySignals[i] != NULL )
		{        
			id    = mySignals[i]->getStationId();
			start = mySignals[i]->getLeftPart()->getStart();
			end   = mySignals[i]->getLeftPart()->getEnd();
			for ( j=0; j<MAX_SIGNALS; j++ )
			{
				if ( (mySignals[j] != NULL) && (mySignals[j]->getStationId() != id))
				{
					if ( isInInterval( mySignals[j]->getLeftPart()->getStart(), start, end ) )
					{
						mySignals[i]->getLeftPart()->setCollisionFlag(TRUE);
						if (!mySignals[i]->getRightPart()->isSent())
						{
							mySignals[i]->getRightPart()->setCollisionFlag(TRUE);
							mySignals[j]->getLeftPart()->setCollisionFlag(TRUE);
						}

						break;
					}

					if ( isInInterval( mySignals[j]->getLeftPart()->getEnd(), start, end ) )
					{
						mySignals[i]->getLeftPart()->setCollisionFlag(TRUE);
						if (!mySignals[i]->getRightPart()->isSent())
						{
							mySignals[i]->getRightPart()->setCollisionFlag(TRUE);
							mySignals[j]->getLeftPart()->setCollisionFlag(TRUE);
						}

						break;
					}

					if ( isInInterval( mySignals[j]->getRightPart()->getStart(), start, end ) )
					{
						mySignals[i]->getLeftPart()->setCollisionFlag(TRUE);
						if (!mySignals[i]->getRightPart()->isSent())
						{
							mySignals[i]->getRightPart()->setCollisionFlag(TRUE);
							mySignals[j]->getLeftPart()->setCollisionFlag(TRUE);
						}

						break;

					}

					if ( isInInterval( mySignals[j]->getRightPart()->getEnd(), start, end ) )
					{
						mySignals[i]->getLeftPart()->setCollisionFlag(TRUE);
						if (!mySignals[i]->getRightPart()->isSent())
						{
							mySignals[i]->getRightPart()->setCollisionFlag(TRUE);
							mySignals[j]->getLeftPart()->setCollisionFlag(TRUE);
						}

						break;
					}
				}
			}

			start = mySignals[i]->getRightPart()->getStart();
			end   = mySignals[i]->getRightPart()->getEnd();
			for ( j=0; j<MAX_SIGNALS; j++ )
			{
				if ( (mySignals[j] != NULL) && (mySignals[j]->getStationId() != id))
				{
					if ( isInInterval( mySignals[j]->getLeftPart()->getStart(), start, end ) )
					{
						mySignals[i]->getRightPart()->setCollisionFlag(TRUE);
						if (!mySignals[i]->getLeftPart()->isSent())
						{
							mySignals[i]->getLeftPart()->setCollisionFlag(TRUE);
							mySignals[j]->getRightPart()->setCollisionFlag(TRUE);
						}

						break;
					}

					if ( isInInterval( mySignals[j]->getLeftPart()->getEnd(), start, end ) )
					{
						mySignals[i]->getRightPart()->setCollisionFlag(TRUE);
						if (!mySignals[i]->getLeftPart()->isSent())
						{
							mySignals[i]->getLeftPart()->setCollisionFlag(TRUE);
							mySignals[j]->getRightPart()->setCollisionFlag(TRUE);
						}
					
						break;
					}

					if ( isInInterval( mySignals[j]->getRightPart()->getStart(), start, end ) )
					{
						mySignals[i]->getRightPart()->setCollisionFlag(TRUE);
						if (!mySignals[i]->getLeftPart()->isSent())
						{
							mySignals[i]->getLeftPart()->setCollisionFlag(TRUE);
							mySignals[j]->getRightPart()->setCollisionFlag(TRUE);
						}

						break;
					}

					if ( isInInterval( mySignals[j]->getRightPart()->getEnd(), start, end ) )
					{
						mySignals[i]->getRightPart()->setCollisionFlag(TRUE);
						if (!mySignals[i]->getLeftPart()->isSent())                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
						{
							mySignals[i]->getLeftPart()->setCollisionFlag(TRUE);
							mySignals[j]->getRightPart()->setCollisionFlag(TRUE);
						}
					
						break;
					}
				}
			}
		}
	}
}

//////////////////////////////////////////////////////////////////////
// Signal class Construction/Destruction
//////////////////////////////////////////////////////////////////////

Signal::Signal(int stationId, int position, int frameSize, Medium* medium) 
{
    myStationId = stationId;
	m_pMyLeftPart = NULL;
	m_pMyRightPart = NULL;
    m_pMyLeftPart = new Part(position,position,-1,frameSize,medium);
    m_pMyRightPart = new Part(position,position, 1,frameSize,medium);
}

Signal::~Signal(void)
{
	if (NULL != m_pMyLeftPart)
	{
		delete m_pMyLeftPart;
		m_pMyLeftPart = NULL;
	}

	if (NULL != m_pMyRightPart)
	{
		delete m_pMyRightPart;
		m_pMyRightPart = NULL;
	}
}

int Signal::getStationId() 
{
    return myStationId;
}

void Signal::setIdle()
{
	m_pMyLeftPart->myDoneFlag=TRUE;
	m_pMyRightPart->myDoneFlag=TRUE;
}

Part* Signal::getLeftPart() 
{
    return m_pMyLeftPart;

⌨️ 快捷键说明

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