24 void MM_maxDelay_Out::initialize() {
25 defaultMaxDel = par(
"defDelay").longValue();
26 if(defaultMaxDel < 0) { error(
"Error at DL_Out. defDelay must be >=0!"); }
29 cXMLElement* Xml = NULL;
30 if (par(
"data").xmlValue() != NULL && par(
"data").xmlValue()->hasChildren()){
31 Xml = par(
"data").xmlValue();
35 cXMLElementList queues = Xml->getChildrenByTagName(
"queue");
36 for(
auto queue : queues){
37 if (!queue->getAttribute(
"id")) { error(
"Error parsing DL_Out Queue. Its ID is missing!"); }
38 std::string
id = queue->getAttribute(
"id");
39 if (
id==
"") { error(
"Error parsing DL_Out Queue. Queue ID cannot be empty!"); }
41 if (!queue->getAttribute(
"delay")) { error(
"Error parsing DL_Out Queue. Its delay is missing!"); }
42 double delay = atof(queue->getAttribute(
"delay"))/1000.0;
43 if (delay<0) { error(
"Error parsing DL_Out Queue. Queue delay must be >=0!"); }
47 if (queue->getAttribute(
"multip")) {
48 multip = atof(queue->getAttribute(
"multip"));
49 if (multip<=0) { error(
"Error parsing DL_Out Queue. Queue multip must be >0!"); }
52 queueName2Delay[id] = delay;
53 queueName2Multip[id] = multip;
57 MM_maxDelay_Out::~MM_maxDelay_Out(){}
59 void MM_maxDelay_Out::finish() {}
62 queueInTime[q].push_back(simTime());
66 queueInTime[q].pop_back();
72 portQueues[p].insert(q);
73 if(queueName2Delay.find(q->getName()) != queueName2Delay.end()) {
74 queueDelay[q] = queueName2Delay[q->getName()];
76 queueDelay[q] = defaultMaxDel;
78 if(queueName2Multip.find(q->getName()) != queueName2Multip.end()) {
79 queueMultip[q] = queueName2Multip[q->getName()];
87 simtime_t min = SimTime::getMaxTime();
88 simtime_t now = simTime();
90 for(
auto & q : portQueues[p]) {
91 if(!queueInTime[q].empty()) {
92 simtime_t temp = queueDelay[q] - now + queueInTime[q].front();
95 temp *= queueMultip[q];
106 queueInTime[ret].pop_front();
111 simtime_t MM_maxDelay_Out::getnextTime(
RMTPort * p) {
Define_Module(MM_maxDelay_Out)