Home / Expert Answers / Electrical Engineering / arq-ned-code-simple-source-parameters-display-34-i-block-source-34-int-limit-defaul-pa999

(Solved): ARQ.ned code: simple Source { parameters: @display("i=block/source"); int limit = defaul ...



ARQ.ned code:
simple Source
{
parameters:
@display("i=block/source");
int limit = default(10000);
gates:
input in;
output out;
}
simple Destination
{
parameters:
@display("i=block/sink");
gates:
input in;
output out;
}
network ARQ2
{
double my_BER;
@display("bgb=179,108");
submodules:
source: Source {
@display("p=40,42");
}
destination: Destination {
@display("p=124,42");
}
connections:
source.out --> {ber = parent.my_BER; datarate = 100 bps;} --> destination.in;
destination.out --> {delay = 100 ms;} -->source.in;
}

ARQ2.cc code:
#include <stdio.h>
#include <string.h>
#include <omnetpp.h>

using namespace omnetpp;

class Source:public cSimpleModule
{
private:
simtime_t timeout;
cMessage *timeoutEvent;
cPacket * pkt;
int limit;

public:
Source();
virtual ~Source();

protected:
virtual void initialize() override;
virtual void handleMessage(cMessage *msg) override;
};

Define_Module(Source);
Source::Source()
{
timeoutEvent = nullptr;
}

Source::~Source()
{
cancelAndDelete(timeoutEvent);
delete pkt;
}

void Source::initialize()
{
timeout = 1.0;
limit = par("limit");
timeoutEvent = new cMessage("timeoutEvent");
EV << "Sending initial packet\n";
pkt = new cPacket("packet");
pkt -> setBitLength(10);
send(pkt-> dup(), "out");
scheduleAt(simTime()+timeout, timeoutEvent);
}

void Source::handleMessage(cMessage *msg)
{
if (msg == timeoutEvent){
EV << "Timeout expired,re-sending message and restarting timer\n";
send(pkt->dup(), "out");
scheduleAt(simTime()+timeout, timeoutEvent);
}
else{
EV << "ACK received\n";
cancelEvent(timeoutEvent);
delete msg;
pkt = nullptr;
if(limit != 0){
pkt = new cPacket("packet");
pkt -> setBitLength (10);
limit--;
send(pkt->dup(), "out");
scheduleAt(simTime()+timeout, timeoutEvent);
}
}
}

class Destination : public cSimpleModule
{
private:
cStdDev delay_stat;
cHistogram hist;

protected:
virtual void handleMessage(cMessage *msg) override;
virtual void finish();
};

Define_Module(Destination);

void Destination::handleMessage(cMessage *msg)
{
cPacket *pkt_received = check_and_cast<cPacket *>(msg);
if(pkt_received -> hasBitError()){
EV << "\"Message\" lost. \n";
bubble("message lost");
delete pkt_received;
}
else{
EV << "Message correctly received. Sending back message as ACK. \n";
simtime_t delay = simTime()-pkt_received -> getCreationTime();
delay_stat.collect(delay);
hist.collect(delay);
send(pkt_received, "out");
}
}

void Destination::finish(){
EV<<"Mean delay = " << delay_stat.getMean() << "\n";
EV<<"Delay variance = " <<delay_stat.getVariance() <<"\n";
EV<<"Standard Deviation = " << delay_stat.getStddev() << "\n";
EV<<"Minimum value delay = " << delay_stat.getMin() << "\n";
EV<<"Maximum delay = "<< delay_stat.getMax() << "\n";
delay_stat.record();
hist.record();
}



We have an Answer from Expert

View Expert Answer

Expert Answer



We have an Answer from Expert

Buy This Answer $5

Place Order

We Provide Services Across The Globe