BaseDecider.h

00001 /*
00002  * BaseDecider.h
00003  *
00004  *  Created on: 24.02.2009
00005  *      Author: karl
00006  */
00007 
00008 #ifndef BASEDECIDER_H_
00009 #define BASEDECIDER_H_
00010 
00011 #include "Decider.h"
00012 
00013 #define deciderEV (ev.isDisabled()||!debug) ? ev : ev << "[Host " << myIndex << "] - PhyLayer(Decider): "
00014 
00040 class BaseDecider: public Decider {
00041 public:
00048   enum BaseDeciderControlKinds {
00050     PACKET_DROPPED = 22100,
00053     LAST_BASE_DECIDER_CONTROL_KIND
00054   };
00055 
00056 protected:
00057 
00059   enum SignalState {
00061     NEW,
00063     EXPECT_HEADER,
00065     EXPECT_END,
00066   };
00067 
00069   double sensitivity;
00070 
00072   typedef std::pair<AirFrame*, int> ReceivedSignal;
00073 
00075   ReceivedSignal currentSignal;
00076 
00078   bool isChannelIdle;
00079 
00081   typedef struct{
00082     ChannelSenseRequest* first;
00083     simtime_t second;
00084     simtime_t canAnswerAt;
00085 
00086     ChannelSenseRequest* getRequest() const { return first; }
00087     void setRequest(ChannelSenseRequest* request) { first = request; }
00088     simtime_t getSenseStart() const { return second; }
00089     void setSenseStart(simtime_t start) { second = start; }
00090     simtime_t getAnswerTime() const { return canAnswerAt; }
00091     void setAnswerTime(simtime_t answerAt) { canAnswerAt = answerAt; }
00092   } CSRInfo;
00093 
00096   CSRInfo currentChannelSenseRequest;
00097 
00100   int myIndex;
00101 
00103   bool debug;
00104 
00105 public:
00112   BaseDecider(DeciderToPhyInterface* phy, double sensitivity,
00113         int myIndex, bool debug):
00114     Decider(phy),
00115     sensitivity(sensitivity),
00116     isChannelIdle(true),
00117     myIndex(myIndex),
00118     debug(debug)
00119   {
00120     currentSignal.first = 0;
00121     currentSignal.second = NEW;
00122     currentChannelSenseRequest.first = 0;
00123     currentChannelSenseRequest.second = -1;
00124     currentChannelSenseRequest.canAnswerAt = -1;
00125   }
00126 
00127   virtual ~BaseDecider() {}
00128 
00129 public:
00136   virtual simtime_t processSignal(AirFrame* frame);
00137 
00145   virtual ChannelState getChannelState();
00146 
00159   virtual simtime_t handleChannelSenseRequest(ChannelSenseRequest* request);
00160 
00161 
00162 
00163 protected:
00173   virtual simtime_t processNewSignal(AirFrame* frame);
00174 
00182   virtual simtime_t processSignalHeader(AirFrame* frame) {
00183     opp_error("BaseDecider does not handle Signal headers!");
00184     return notAgain;
00185   }
00186 
00196   virtual simtime_t processSignalEnd(AirFrame* frame);
00197 
00202   virtual simtime_t processUnknownSignal(AirFrame* frame) {
00203     opp_error("Unknown state for the AirFrame with ID %d", frame->getId());
00204     return notAgain;
00205   }
00206 
00214   virtual int getSignalState(AirFrame* frame);
00215 
00220   virtual simtime_t handleNewSenseRequest(ChannelSenseRequest* request);
00221 
00230   virtual void handleSenseRequestEnd(CSRInfo& requestInfo);
00231 
00238   virtual void setChannelIdleStatus(bool isIdle);
00239 
00245   virtual simtime_t canAnswerCSR(const CSRInfo& requestInfo);
00246 
00257   virtual double calcChannelSenseRSSI(simtime_t start, simtime_t end);
00258 
00265   virtual void answerCSR(CSRInfo& requestInfo);
00266 
00274   virtual void channelStateChanged();
00275 
00288   virtual void getChannelInfo(simtime_t start, simtime_t end,
00289                 AirFrameVector& out);
00290 
00291   //------Utility methods------------
00292 
00304   virtual Mapping* calculateSnrMapping(AirFrame* frame);
00305 
00314   virtual Mapping* calculateRSSIMapping(  simtime_t start,
00315                       simtime_t end,
00316                       AirFrame* exclude = 0);
00317 };
00318 
00319 #endif /* BASEDECIDER_H_ */