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
原文:https://www.cnblogs.com/crescental/p/14789075.html