// // Copyright (C) 2012 Opensim Ltd. // Author: Tamas Borbely // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program; if not, see . // #include #include #include #include "inet/common/INETDefs.h" #include "inet/networklayer/ipv4/IPv4Datagram.h" using namespace std; namespace inet { class MeterTestApp : public cSimpleModule { int numPackets; simtime_t stopTime; vector colors; int counter; cMessage *timer; ofstream out; protected: virtual void initialize(); virtual void finalize(); virtual void handleMessage(cMessage *msg); }; Define_Module(MeterTestApp); void MeterTestApp::initialize() { numPackets = par("numPackets"); stopTime = par("stopTime"); colors = cStringTokenizer(par("colors")).asVector(); if ((int)colors.size() != gateSize("in")) throw cRuntimeError("Too %s colors are specified in the colors parameter.", (int)colors.size() < gateSize("in") ? "few" : "many"); counter = 0; timer = new cMessage("Timer"); const char *filename = par("resultFile"); out.open(filename); if (out.fail()) throw cRuntimeError("Can not open file %s", filename); out << left << setw(12) << "Packet" << setw(12) << "Conformance" << "\n"; double startTime = par("startTime"); if (stopTime < SIMTIME_ZERO || stopTime >= startTime) scheduleAt(startTime, timer); } void MeterTestApp::finalize() { cancelAndDelete(timer); out.close(); } void MeterTestApp::handleMessage(cMessage *msg) { if (msg->isSelfMessage()) { ostringstream packetName; packetName << "packet-" << (++counter); cPacket *packet = new IPv4Datagram(packetName.str().c_str()); packet->setByteLength(par("packetSize").longValue()); send(packet, "out"); if ((numPackets == 0 || counter < numPackets) && (stopTime < SIMTIME_ZERO || simTime() < stopTime)) scheduleAt(simTime() + par("iaTime"), msg); else delete msg; } else { int gateIndex = msg->getArrivalGate()->getIndex(); out << left << setw(12) << msg->getName() << setw(12) << colors[gateIndex] << "\n"; delete msg; } } } // namespace inet