📄 commctl.cpp
字号:
// 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 + -