首页 > 其他 > 详细

RedundancyChecker 关于迭代器、容器的使用

时间:2021-05-20 15:08:57      阅读:23      评论:0      收藏:0      [点我收藏+]

1..h文件

#ifndef __REDUNDANCYCHECKER_H__
#define __REDUNDANCYCHECKER_H__

#include "AFDXDefs.h"
#include<vector>
#include<map>
#include<iostream>
#include<algorithm>
namespace afdx {

using namespace std;

/**
* TODO - Generated class
*/
class RedundancyChecker : public cSimpleModule
{
private:
bool enabled;
simtime_t skewMax;
simtime_t lastFrameReceived;
int nextSeqExpected;
multimap<int,simtime_t>T;
multimap<int,simtime_t>::iterator it;
int len;
int i;
simtime_t arrivaltime;
protected:
virtual void initialize();
virtual void handleMessage(cMessage *msg);
};

}; // namespace afdx

#endif

2..cc文件

#include "RedundancyChecker.h"
#include "AFDXMessage_m.h"

namespace afdx {

Define_Module(RedundancyChecker);

void RedundancyChecker::initialize()
{
enabled = par("enabled");
skewMax = par("skewMax");
lastFrameReceived = simTime();
nextSeqExpected = 0;

}

void RedundancyChecker::handleMessage(cMessage *msg)
{
// if not enabled just pass through all frames received
if (!enabled) {
send(msg,"out");
return;
}

// filter out redundant messages
AFDXMessage *afdxMsg = check_and_cast<AFDXMessage *>(msg);
int currSeqNum = afdxMsg->getSeqNum();
/*int currNetworkId=afdxMsg->getNetworkId();
int currEquipmentId=afdxMsg->getEquipmentId();
int currInterfaceId=afdxMsg->getInterfaceId();
int currVirtualLinkId=afdxMsg->getVirtualLinkId();
int currPartitionId=afdxMsg->getPartitionId();
int currUdpSrcPort=afdxMsg->getUdpSrcPort();
int currUdpDestPort=afdxMsg->getUdpDestPort();
EV<<"currSeqNum"<<currSeqNum;
EV<<"currNetworkId"<<currNetworkId;
EV<<"currEquipmentId"<<currEquipmentId;
EV<<"currInterfaceId"<<currInterfaceId;
EV<<"currVirtualLinkId"<<currVirtualLinkId;
EV<<"currPartitionId"<<currPartitionId;
EV<<"currUdpSrcPort"<<currUdpSrcPort;
EV<<"currUdpDestPort"<<currUdpDestPort;*/
arrivaltime=afdxMsg->getArrivalTime();
it=T.find(currSeqNum);
len=T.count(currSeqNum);
if (currSeqNum<nextSeqExpected){
delete msg;
return;
}else{
if(len==0){
T.insert(make_pair(currSeqNum,arrivaltime));
EV<<"msg first arrived on redunancy"<<endl;
}else{
for(i=0,len=T.count(currSeqNum);i<len;i++,it++){
if(i==len-1){
EV<<"last arrived on"<<it->second<<endl;
if ((arrivaltime-it->second)>skewMax){
delete msg;
EV<<"time excess so dropped"<<endl;
return;
}else{
T.insert(make_pair(currSeqNum,arrivaltime));
EV<<"redundancy arrived but not excess"<<endl;
}
}
}
}
}


// drop the frame if the seqNum is smaller than the one we are expecting
// and the last frame was received recently (less than skewMax time ago)
//if (currSeqNum < nextSeqExpected && simTime() - lastFrameReceived <= skewMax) {
//delete msg;
//return; // frame dropped. do not update the next expected counter
//}
send(msg,"out");

lastFrameReceived = simTime();
// store the last sequence number.
nextSeqExpected = currSeqNum + 1;
if (nextSeqExpected > 255)
nextSeqExpected = 1;
}

}; // namespace afdx

RedundancyChecker 关于迭代器、容器的使用

原文:https://www.cnblogs.com/crescental/p/14789075.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!