00001
00002
00003
00004
00005
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
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