Decider80211MultiChannel.cc

00001 /*
00002  * Decider80211MultiChannel.cpp
00003  *
00004  *  Created on: Mar 22, 2011
00005  *      Author: karl
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(); //iterate to payload bitrate indicator
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 }