00001
00002
00003
00004
00005
00006
00007
00008 #include "Decider80211MultiChannel.h"
00009 #include "DeciderResult80211.h"
00010
00011 Decider80211MultiChannel::Decider80211MultiChannel(DeciderToPhyInterface* phy,
00012 double threshold,
00013 double sensitivity,
00014 double decodingCurrentDelta,
00015 int currentChannel,
00016 int myIndex,
00017 bool debug):
00018 Decider80211Battery(phy, threshold, sensitivity,
00019 currentChannel, decodingCurrentDelta,
00020 myIndex, debug),
00021 currentChannel(currentChannel)
00022 {
00023 }
00024
00025 Decider80211MultiChannel::~Decider80211MultiChannel() {}
00026
00027 void Decider80211MultiChannel::getChannelInfo(simtime_t start, simtime_t end, AirFrameVector& out)
00028 {
00029 Decider80211Battery::getChannelInfo(start, end, out);
00030
00031 for(AirFrameVector::iterator it = out.begin();
00032 it != out.end(); ++it)
00033 {
00034 AirFrame* af = *it;
00035 if(af->getChannel() != currentChannel) {
00036 it = out.erase(it);
00037 --it;
00038 }
00039 }
00040 }
00041
00042 simtime_t Decider80211MultiChannel::processNewSignal(AirFrame* frame) {
00043 if(frame->getChannel() != currentChannel)
00044 return notAgain;
00045
00046 return Decider80211Battery::processNewSignal(frame);
00047 }
00048
00049 DeciderResult* Decider80211MultiChannel::checkIfSignalOk(AirFrame* frame) {
00050 DeciderResult* result = 0;
00051
00052 if(frame->getChannel() != currentChannel) {
00053 ConstMappingIterator* bitrateIt
00054 = frame->getSignal().getBitrate()->createConstIterator();
00055 bitrateIt->next();
00056 double payloadBitrate = bitrateIt->getValue();
00057 delete bitrateIt;
00058 deciderEV << "Channel changed during reception. packet is lost!\n";
00059 result = new DeciderResult80211(false, payloadBitrate, 0);
00060 } else {
00061 result = Decider80211Battery::checkIfSignalOk(frame);
00062 }
00063
00064 return result;
00065 }
00066
00067 void Decider80211MultiChannel::channelChanged(int newChannel) {
00068 assert(1 <= currentChannel && currentChannel <= 14);
00069 currentChannel = newChannel;
00070 centerFrequency = CENTER_FREQUENCIES[currentChannel];
00071 channelStateChanged();
00072 }