#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
class Tic8 : public cSimpleModule
{
private:
double timeout;
cMessage *timeoutEvent;
int seq;
cMessage *message;
public:
Tic8();
virtual ~Tic8();
protected:
virtual cMessage *generateNewMessage();
virtual void sendCopyOf(cMessage *msg);
virtual void initialize();
virtual void handleMessage(cMessage *msg);
};
Define_Module(Tic8);
Tic8::Tic8()
{
timeoutEvent = message = NULL;
}
Tic8::~Tic8()
{
cancelAndDelete(timeoutEvent);
delete message;
}
void Tic8::initialize()
{
seq = 0;
timeout = 1.0;
timeoutEvent = new cMessage("timeoutEvent");
ev << "Sending initial message\n";
message = generateNewMessage();
sendCopyOf(message);
scheduleAt(simTime()+timeout, timeoutEvent);
}
void Tic8::handleMessage(cMessage *msg)
{
if (msg==timeoutEvent)
{
ev << "Timeout expired, resending message and restarting timer\n";
sendCopyOf(message);
scheduleAt(simTime()+timeout, timeoutEvent);
}
else
{
ev << "Received: " << msg->name() << "\n";
delete msg;
ev << "Timer cancelled.\n";
cancelEvent(timeoutEvent);
delete message;
message = generateNewMessage();
sendCopyOf(message);
scheduleAt(simTime()+timeout, timeoutEvent);
}
}
cMessage *Tic8::generateNewMessage()
{
char msgname[20];
sprintf(msgname, "tic-%d", ++seq);
cMessage *msg = new cMessage(msgname);
return msg;
}
void Tic8::sendCopyOf(cMessage *msg)
{
cMessage *copy = (cMessage *) msg->dup();
send(copy, "out");
}
class Toc8 : public cSimpleModule
{
protected:
virtual void handleMessage(cMessage *msg);
};
Define_Module(Toc8);
void Toc8::handleMessage(cMessage *msg)
{
if (uniform(0,1) < 0.1)
{
ev << "\"Losing\" message " << msg << endl;
bubble("message lost");
delete msg;
}
else
{
ev << msg << " received, sending back an acknowledgement.\n";
delete msg;
send(new cMessage("ack"), "out");
}
}